为什么标准 ml 中的这个函数附加列表不起作用?

Why this function append list in standard ml can't work?

在 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》第258页:

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

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

在 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];