Error: operator and operand do not agree with trees
Error: operator and operand do not agree with trees
我一直在尝试制作一个接受 int arbol1 的函数,即:
datatype ’a arbol1 = Nodo of ’a * ’a arbol1 list
这是这棵树的一个例子:
Nodo(1, [Nodo(2, [Nodo(6, []), Nodo(3, [])]), Nodo(1, [])])
而且它必须复制每个节点的 int 变量,这是我设法编写的代码,但它不起作用,我不明白为什么,这里是:
fun dobleArbol1 (Nodo(x, [])) = Nodo(x * 2, [])
| dobleArbol1 (Nodo(x, t :: ts) : int arbol1) =
Nodo(x * 2, dobleArbol1(t) :: dobleArbol1(hd(ts)));
编译器给我这个错误:
stdIn:151.50-151.91 Error: operator and operand do not agree [tycon mismatch]
operator domain: int arbol1 * int arbol1 list
operand: int arbol1 * int arbol1
in expression:
dobleArbol1 t :: dobleArbol1 (hd ts)
你想多了。
树中的一个节点有一个值和一个树列表(可能为空)。
要将函数映射到任何节点中的每个值,您需要将该函数应用于该值,然后将其映射到树列表中。
一个非常简单的列表映射如下所示:
fun listMap(f, []) = []
| listMap(f, x::xs) = f x :: listMap(f, xs)
现在有树图功能:
fun treeMap(f, Nodo(x, lst)) =
Nodo(f x, listMap((fn t => treeMap(f, t)), lst))
然后将树中的每个值加倍只是 treeMap
的应用。
fun doubleTree(t) = treeMap((fn x => x * 2), t)
如果我们愿意,我们可以很容易地将树中的每个数字乘以 2,加 1,除以 3:
treeMap((fn x => (x * 2 + 1) / 3), t)
当你分解大问题时,它们会变得更容易。
关于你的具体错误:
dobleArbol1(t) :: dobleArbol1(hd(ts))
我们知道您希望 dobleArbol1
将树映射到树。但是 ::
的右手操作数必须是一个列表。
我们可以通过尝试一个更简单的函数来查看实际效果:
fun f x = x :: x
我一直在尝试制作一个接受 int arbol1 的函数,即:
datatype ’a arbol1 = Nodo of ’a * ’a arbol1 list
这是这棵树的一个例子:
Nodo(1, [Nodo(2, [Nodo(6, []), Nodo(3, [])]), Nodo(1, [])])
而且它必须复制每个节点的 int 变量,这是我设法编写的代码,但它不起作用,我不明白为什么,这里是:
fun dobleArbol1 (Nodo(x, [])) = Nodo(x * 2, [])
| dobleArbol1 (Nodo(x, t :: ts) : int arbol1) =
Nodo(x * 2, dobleArbol1(t) :: dobleArbol1(hd(ts)));
编译器给我这个错误:
stdIn:151.50-151.91 Error: operator and operand do not agree [tycon mismatch]
operator domain: int arbol1 * int arbol1 list
operand: int arbol1 * int arbol1
in expression:
dobleArbol1 t :: dobleArbol1 (hd ts)
你想多了。
树中的一个节点有一个值和一个树列表(可能为空)。
要将函数映射到任何节点中的每个值,您需要将该函数应用于该值,然后将其映射到树列表中。
一个非常简单的列表映射如下所示:
fun listMap(f, []) = []
| listMap(f, x::xs) = f x :: listMap(f, xs)
现在有树图功能:
fun treeMap(f, Nodo(x, lst)) =
Nodo(f x, listMap((fn t => treeMap(f, t)), lst))
然后将树中的每个值加倍只是 treeMap
的应用。
fun doubleTree(t) = treeMap((fn x => x * 2), t)
如果我们愿意,我们可以很容易地将树中的每个数字乘以 2,加 1,除以 3:
treeMap((fn x => (x * 2 + 1) / 3), t)
当你分解大问题时,它们会变得更容易。
关于你的具体错误:
dobleArbol1(t) :: dobleArbol1(hd(ts))
我们知道您希望 dobleArbol1
将树映射到树。但是 ::
的右手操作数必须是一个列表。
我们可以通过尝试一个更简单的函数来查看实际效果:
fun f x = x :: x