ML。错误:运算符和操作数不同意[tycon mismatch]

时间:2014-05-23 17:10:26

标签: error-handling ml

我有这段代码:

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)

为什么?

1 个答案:

答案 0 :(得分:0)

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没有函数或构造函数的多个参数的概念,而是传递元组。使用中缀运算符,这可能会让您感到有些困惑,因为编译器为您做了一些语法糖。

给出类似

的功能
fun f (x, y) = (* ... *)

你可以像f (a, b)f pair一样调用它,其中pair是一对...如果你声明它是中缀,你可以a f b但这个只是用一对来调用它的语法糖。