我在调用SML函数时遇到了似乎是一个优先问题,替换:
fun substitute v new (typevar q) = ...
我从另一个函数中调用它:
fun new_type_vars (typevar v) non_gens =
substitute v new_var() (typevar v)
但是我收到了一个错误:
C:/sml/type_checker.sml:22.48-23.44 Error: operator and operand don't agree [tycon mismatch] operator domain: type_exp operand: unit -> string in expression: (substitute v) new_var
这似乎表明它正在尝试调用(替换v),然后使用参数new_var调用该调用的结果。
我尝试在整个事情周围添加括号,但这没有帮助,当我在(v new_var...)
这样的参数周围添加括号时,它认为v是new_var上的函数应用程序。这个函数调用发生了什么?
答案 0 :(得分:1)
我不明白所有事情,因为你没有给出所有类型的不同操作和变量。
但是你已经猜到的一般问题就是你已经猜到,SML从左侧执行函数调用(并绑定变量)。这是一个例子:
fun f a:int b:int c:string = ...
因此,f是int - >类型的函数。 int - > string - > ...并隐式添加括号fun(((f a:int)b:int)c:int)= ...
这意味着您可以使用它,例如:
var f2 = f 3;
f2现在的类型为int - > string - > ...
答案 1 :(得分:1)
您可能想要更改
substitute v new_var() (typevar v)
到
substitute v (new_var()) (typevar v)
(布塔的答案解释了原因。)