Почему я получаю эти ошибки и как я могу их решить?

#interpreter #sml

#интерпретатор #sml

Вопрос:

Я пишу интерпретатор на стандартном ML, но у меня проблемы с синтаксисом в этой функции, и я не могу понять, что не так.

Вот соответствующий код:

 | eval (rho, SetExp (name, value)) =
    (case rhoContains rho name of
        true    => rhoSet rho name value (rho, value)
    |   false   => globalSet (name, value))


fun rhoSet [] key value = [(key, value)]
  | rhoSet ((elt as (k, v)) :: tail) key value =
        if key = k then (key, value) :: tail else elt :: rhoSet tail key value


fun rhoContains rho name =
    case rhoGet rho name of SOME _ => true | NONE => false
  

Вот откуда берется SetExp:

 datatype expression =
    SetExp of (string * expression)
  

Запуск этого дает мне длинный список ошибок, но я думаю, что это соответствующий раздел. Строка 62 — это строка, начинающаяся с true in eval :

 eval.sml:62: error: Type error in function application.
  Function: rhoSet rho name value : (string * expression) list
  Argument: (rho, value) : (string * expression) list * expression
  Reason: Value being applied does not have a function type
  

Ответ №1:

Вы передаете слишком много аргументов для rhoSet удаления завершающей пары.

 | eval (rho, SetExp (name, value)) =
    (case rhoContains rho name of
        true    => rhoSet rho name value
    |   false   => globalSet (name, value))
  

Вы также можете сделать это более читаемым с помощью условного:

 | eval (rho, SetExp (name, value)) =
    if rhoContains rho name
    then rhoSet rho name value
    else globalSet (name, value)
  

Ответ №2:

Для SML в выражении rhoSet rho name value (rho, value) rhoSet rho name value является функцией и (rho, value) является аргументом этой функции. Однако, по определению rhoSet , rhoSet rho name value обязательно является списком, а не функцией. Вот что означает сообщение об ошибке.