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