代码之家  ›  专栏  ›  技术社区  ›  Kai

SML函数调用不将参数分析为参数

  •  0
  • Kai  · 技术社区  · 16 年前

    在调用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是一个新变量上的函数应用程序。这个函数调用发生了什么?

    2 回复  |  直到 16 年前
        1
  •  1
  •   Darius Bacon    16 年前

    你可能想改变

    substitute v new_var() (typevar v)
    

    substitute v (new_var()) (typevar v)
    

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

        2
  •  1
  •   Darius Bacon    16 年前

    我不理解所有的事情,因为你没有给出不同操作和变量的所有类型。

    但是,正如您已经猜到的,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->…