【发布时间】:2019-02-23 15:36:18
【问题描述】:
我是 Haskell 的新手,对某些语法部分(来自 C/C++)仍然有些困惑。
我有这个 Tree 数据类型(如下)和 t2 的构造函数
data Tree a b = Leaf a
| Node b (Tree a b) (Tree a b)
deriving (Eq, Show)
t2 :: Tree Bool Int
t2 = Node 17 (Node 2 (Leaf True)
(Node 7 (Leaf False)
(Leaf False)))
(Leaf True)
我需要编写一个函数来计算树的节点数
sizeTree :: Tree a b -> Int
我很困惑为什么 sizeTree 会为函数传入“a”和“b”。是因为“a”有一个叶子,“b”有一个节点吗?我知道这需要递归调用,但我应该从哪里开始?
【问题讨论】:
-
a b 是类型,例如 Int Char 等。它们被传递给 Tree 而不是 sizetree Think c±+ 模板类
-
如果你是 Haskell 的新手,那么我会从一个更简单的树开始,比如
data Tree a = Empty | Node a (Tree a) (Tree a)并忘记派生。现在实现函数size :: Tree a -> Int。没有必要将其命名为sizeTree,因为从您的签名的其余部分可以看出它是用于树木的。 -
sizeTree不接受三个参数Tree、a和b,而只接受一个(Tree a b)。后者类似于 C++ 模板Tree<a,b>。那将是一棵树,其叶子带有a类型的值,而内部节点带有b类型的值。
标签: haskell