我正在用Standard 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
中以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
答案 0 :(得分:2)
您要向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)
答案 1 :(得分:1)
对于SML,在表达式rhoSet rho name value (rho, value)
中,rhoSet rho name value
是一个函数,而(rho, value)
是该函数的自变量。但是,根据rhoSet
的定义,rhoSet rho name value
必然是一个列表,而不是一个函数。这就是错误消息的含义。