Haskell:计算树的节点

时间:2018-06-29 17:34:33

标签: haskell count functional-programming tree nodes

我有一个自定义数据类型:

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

1 个答案:

答案 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都会返回正确的计数。