大家好,这是我的第一个问题,我对Haskell很新,我需要做一个Haskell函数,它接受一个Tree并在前序遍历中返回其节点中的元素列表但是我可以& #39;让它发挥作用。
我的树定义如下:
data Tree a = Node a [Tree a] deriving Show
,预订功能是:
preorderTree :: Tree a -> [a]
preorderTree Empty = []
preorderTree (Node a l r) = a : (preorderTree l) ++ (preorderTree r)
事先感谢你的帮助:)
答案 0 :(得分:2)
在Haskell中,类型是一组值。所以我们有类型构造函数和值构造函数。
所以写一个haskell函数。我们需要正确定义类型(Tree
)。在相应的类型中处理每个值(Empty
,Node ...
)。
Tree a
是类型。它的值是Empty
或一堆孩子。因此我们有
data Tree a = Empty
| Node a [Tree a]
所以当我们编写像preorderTree :: Tree a -> [a]
这样的函数时。我们正在处理类型 Tree a
,因此我们必须处理值Empty
和Node a [Tree a]
。所以我们有
preorderTree :: Tree a -> [a]
preorderTree Empty = []
preorderTree (Node a children) = a : concatMap preorderTree children
这是一棵玫瑰树,如果你只想要一棵二叉树,我们需要更改Tree a
类型的值构造函数,因为[Tree a]
对于二叉树来说太多了。所以我们有
data Tree a = Empty
| Node a (Tree a) (Tree a)
preorderTree :: Tree a -> [a]
preorderTree Empty = []
preorderTree (Node a left right) = a : preorderTree left ++ preorderTree right