0

我在调用 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 错误:运算符和操作数不一致 [tycon mismatch]
      运算符域:type_exp
      操作数:单位 -> 字符串
      表达:
        (替代 v)new_var

这似乎表明它正在尝试调用(替换 v),然后使用参数 new_var 调用该调用的结果。

我尝试在整个内容周围添加括号,但这没有帮助,当我在参数周围添加括号时,(v new_var...)它认为 v 是 new_var 上的函数应用程序。这个函数调用是怎么回事?

4

2 回答 2

1

我不明白一切,因为你没有给出不同操作和变量的所有类型。

但是您遇到的一般问题是您已经猜到了,SML 从左侧执行函数调用(并绑定变量)。这里有一个例子:

fun f a:int b:int c:string = ...

因此 f 是 int -> int -> string -> ... 类型的函数,并隐式添加括号 fun (((fa:int) b:int) c:int) = ...

这意味着您可以像这样使用它:

var f2 = f 3;

f2 现在的类型是 int -> string -> ...

于 2009-04-17T06:10:32.083 回答
1

你可能想改变

substitute v new_var() (typevar v)

substitute v (new_var()) (typevar v)

(布塔的回答解释了原因。)

于 2009-04-17T06:19:31.890 回答