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
,但这只是用一对来调用它的语法糖