我有一个自定义数据类型:
data Tree a = Node a [Tree a]
示例树:
tree1 = Node 3 [Node 4 [Node 3 [], Node 2 []], Node 5 []]
在尝试创建一个计算树的节点数的函数时,我很费力。
我有一个功能:
numNodes :: Num p => Tree a -> p
numNodes(Node a []) = 0
numNodes(Node a b) = 1 + numNodes b
但这不是真的有效,我在哪里错了?
编辑: 编译器输出:
• Couldn't match type ‘Tree a’ with ‘[Tree a]’
Expected type: [Tree a] -> p
Actual type: Tree a -> p
• Relevant bindings include
numNodes :: [Tree a] -> p (bound at tree.hs:28:1)
28 | numNodes(Node a []) = 0
答案 0 :(得分:3)
首先,您不能用数据类型表示一棵空树;您只能表示一个具有单个节点且没有子树的树。
numNodes (Node a []) = 1
第二,每个节点都作为0个或多个 substrees 作为子节点。您需要使用map
计算每个子树中的节点数,然后对每个子树的计数求和。
numNodes (Node a b) = 1 + sum (map numNodes b)
因为根据定义,sum [] == 0
实际上不需要基本情况,因为无论sum (map numNodes b)
是否为非空,b
都会返回正确的计数。