Haskell树遍历
大家好,这是我在这里的第一个问题,我对Haskell很陌生,我需要做一个Haskell函数,它接受一棵树,并以预序遍历的方式返回其节点中的元素列表,但我无法让它工作 我的树定义如下:Haskell树遍历,haskell,recursion,tree,Haskell,Recursion,Tree,大家好,这是我在这里的第一个问题,我对Haskell很陌生,我需要做一个Haskell函数,它接受一棵树,并以预序遍历的方式返回其节点中的元素列表,但我无法让它工作 我的树定义如下: data Tree a = Node a [Tree a] deriving Show 预排序函数是: preorderTree :: Tree a -> [a] preorderTree Empty = [] preorderTree (Node a l r) = a : (preorderTree l)
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)
事先非常感谢您的帮助:)在Haskell中,type是一组值。所以我们有类型构造函数和值构造函数 所以写一个haskell函数。我们需要正确定义类型(
树
)。在相应的类型中处理每个值(空的,节点…
)
树a
是一种类型。它的值要么是空的
,要么是一堆子项。因此,我们有
data Tree a = Empty
| Node a [Tree a]
因此,当我们编写一个类似于preorderTree::Tree a->[a]
的函数时。我们处理的是类型树a
,因此我们必须处理值空
和节点a[树a]
。所以我们有
preorderTree :: Tree a -> [a]
preorderTree Empty = []
preorderTree (Node a children) = a : concatMap preorderTree children
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
这是一棵玫瑰树,如果您只想要一棵二叉树,我们需要更改树a
类型的值构造函数,因为[tree a]
对于二叉树来说太多了。所以我们有
preorderTree :: Tree a -> [a]
preorderTree Empty = []
preorderTree (Node a children) = a : concatMap preorderTree children
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
好吧,您已经编写了节点
,只接受两个参数,但模式匹配了三个参数。您有玫瑰树的数据定义,但函数似乎需要二叉树。如果您希望preorderTree
用于树
数据类型,请查看concatMap
。这实际上不是您的第一个问题,因为您实际上没有问任何问题。您还没有发布任何错误消息。鉴于遍历和数据声明不匹配,有两种可能的修复方法。哪种修复方法是正确的还不清楚,所以我投票决定关闭。请随意编辑问题。非常感谢您的帮助,这真的对我很有帮助,而且我也开始非常喜欢Haskell:)