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)

大家好,这是我在这里的第一个问题,我对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) ++ (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:)