【问题标题】:SML function call doesn't parse arguments as argumentsSML 函数调用不会将参数解析为参数
【发布时间】:2010-10-20 00:45:12
【问题描述】:

我在调用 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 上的函数应用程序。这个函数调用是怎么回事?

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    你可能想要改变

    substitute v new_var() (typevar v)
    

    substitute v (new_var()) (typevar v)
    

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

    【讨论】:

      【解决方案2】:

      我不了解所有内容,因为您没有给出不同操作和变量的所有类型。

      但是您遇到的一般问题是您已经猜到了,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 -> ...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-06
        • 1970-01-01
        • 2016-06-06
        • 1970-01-01
        • 2020-10-25
        • 2013-05-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多