haskell - Haskell:计算树的节点
问题描述
我有一个自定义数据类型:
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
解决方案
首先,您不能用您的数据类型表示一棵空树;您只能表示具有单个节点且没有子树的树。
numNodes (Node a []) = 1
其次,将每个节点作为 0 个或多个子树作为子节点。您需要使用map
计算每个子树中的节点数,然后将每个子树的计数相加。
numNodes (Node a b) = 1 + sum (map numNodes b)
因为sum [] == 0
根据定义,您实际上并不需要基本情况,因为sum (map numNodes b)
无论是否b
非空都会返回正确的计数。
推荐阅读
- c# - 如何在 C# 中检索当前一周的正确时间的开始日期和结束日期?
- javascript - 如何在 Google 一键式 UI 中为新用户显示隐私政策 URL 和服务条款 URL?
- python - 如何在 Jupyter 笔记本中显示格式化/缩进的 HTML 代码
- c# - 从包含双精度数组的arraylist中删除重复项
- javascript - 使用 setTimeout 实现 setInterval
- php - PHP数组合并
- c# - 如何拆分周期性文本?
- ios - Dynamic Cell Sizing:Overriding Xcode storyboard constraints
- c++ - 如何将不在QT全局范围内的函数附加到Qwidget
- php - 用于转换星级值的PHP代码