为什么标准 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];
在 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];