Error handling ML.错误:运算符和操作数don';不同意[泰康不匹配]

Error handling ML.错误:运算符和操作数don';不同意[泰康不匹配],error-handling,ml,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:

我有以下代码:

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,1)
(y,2)
调用
,这两个都是成对的。解决这一问题的一种方法是:

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
是一些对。。。如果您将其声明为中缀,您可以执行
afb
,但这只是用一对来调用它的语法糖