【问题标题】:Why this function append list in standard ml can't work?为什么标准 ml 中的此功能附加列表不起作用?
【发布时间】:2021-12-08 19:35:03
【问题描述】:

在ocaml中,这可以工作:

# let a b c=b@[c];;
val a : 'a list -> 'a -> 'a list = <fun>
# a [1] 2;;
- : int list = [1; 2]

当使用 sml(sml/nj) 时:

- fun a(b,c)=b@[c];;
val a = fn : 'a list * 'a -> 'a list
- a [1] 2;;
stdIn:4.1-4.8 Error: operator and operand do not agree [tycon mismatch]
operator domain: 'Z list * 'Z
operand:         'Y[INT] list
in expression:
a (1 :: nil)

我看到了《ml for the working programming》第 258 页:

fun enq(q,x)=q@[x]

那么为什么在 sml 中出现这个错误?谢谢!

【问题讨论】:

    标签: sml


    【解决方案1】:

    在 OCaml 示例中,您以柯里化风格编写了函数。这是意料之中的,因为这是该语言的惯用风格。

    这种风格在 SML 中有效,但将元组传递给函数更符合习惯。你已经用这种方式定义了a

    为了便于阅读,对代码进行了轻微编辑。

    fun a(b, c) = b @ [c];
    

    但是,在调用它时,您使用的是柯里化样式。

    a [1] 2;
    

    在 OCaml 和 SML 之间来回移动时,这是一个可以理解的错误,但它解释了您遇到的问题。

    你应该写:

    a([1], 2);
    

    或者您可以在 SML 中定义 a,使用与 OCaml 中相同的柯里化样式:

    fun a b c = b @ [c];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      • 2017-05-14
      • 2022-01-27
      • 1970-01-01
      • 2017-01-14
      相关资源
      最近更新 更多