我有以下代码:
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/