我有以下代码:

datatype ('a, 'b) alterlist = nil | :: of ('a*'b) * ('a, 'b) alterlist;
infixr 5 ::

fun build4(x, one, y, two) = (x,one)::(y,two);

我得到这个错误:
datatype ('a,'b) alterlist = :: of ('a * 'b) * ('a,'b) alterlist | nil
stdIn:41.30-41.46 Error: operator and operand don't agree [tycon mismatch]
operator domain: ('Z * 'Y) * ('Z,'Y) alterlist
operand:  ('Z * 'Y) * ('X * 'W)
in expression:
        (x,one) :: (y,two)

为什么?

最佳答案

在对alterlist的定义中,构造函数::以元组作为参数:

:: of ('a*'b) * ('a, 'b) alterlist

当使用alterlist构造函数构造::时,应使用('a*'b)类型的一个值和('a, 'b) alterlist类型的另一个值来调用它。

您正在尝试同时使用成对的::(x,one)调用(y,two)。解决此问题的一种方法是:
fun build4(x, one, y, two) = (x,one) :: ((y,two)::nil)

因为((y,two)::nil)是一个备用列表。

请注意,::的参数类型实际上是一对('a*'b) * ('a, 'b) alterlist。 ML没有为函数或构造函数提供多个参数的概念,而是传递了元组。使用infix运算符可能会有些困惑,因为编译器会为您处理一些语法糖。

给定一个像
fun f (x, y) = (* ... *)

您可以像f (a, b)f pair一样正常地调用它,其中pair是一对...如果声明它为中缀,则可以执行a f b,但这只是用一对来调用它的语法糖。

关于error-handling - ML。错误: operator and operand don't agree [tycon mismatch],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23834909/

10-12 01:15
查看更多