gpt4 book ai didi

error-handling - ML。错误: operator and operand don't agree [tycon mismatch]

转载 作者:行者123 更新时间:2023-12-03 08:56:23 25 4
gpt4 key购买 nike

我有以下代码:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com