我有这段代码:
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)
为什么?
答案 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
但这个只是用一对来调用它的语法糖。