Haskell 如何在列表中存储树数据?

Haskell 如何在列表中存储树数据?,haskell,Haskell,我有一个二叉树,如下所示 (1) / \ (2) (3) / \ (4) (5) 并希望使用递归函数按左右顺序生成新列表来存储此树数据 我首先创建了二叉树,并试图将数据存储在一个列表中。 但不知道如何将它们存储在列表中 data Tree a = Node a (Tree a) (Tree a) | Empty tree :: Tree a -> [a] tree Empty = 0 tree (Node x l r) = ????????? 因此,预

我有一个二叉树,如下所示

     (1)
    /   \
  (2)   (3)
 /  \
(4) (5)
并希望使用递归函数按左右顺序生成新列表来存储此树数据

我首先创建了二叉树,并试图将数据存储在一个列表中。 但不知道如何将它们存储在列表中

data Tree a = Node a (Tree a) (Tree a) | Empty
tree :: Tree a -> [a]
tree Empty = 0
tree (Node x l r) = ?????????
因此,预期的输出是
[4,2,5,1,3]

它是递归完成的:

data Tree a = Node a (Tree a) (Tree a) | Empty
    deriving Show

tree :: Tree a -> [a]

-- Bottom of the tree, nothing to see here
tree Empty = []

-- Append left subtree, self and right subtree
tree (Node x l r) = (tree l) ++ [x] ++ (tree r) 

-- prints [4, 2, 5, 1, 3]
main =
    let t1 = Node 2 (Node 4 Empty Empty) (Node 5 Empty Empty)
        t2 = (Node 3 Empty Empty)
        t = Node 1 t1 t2
    in print $ tree t 
它是递归完成的:

data Tree a = Node a (Tree a) (Tree a) | Empty
    deriving Show

tree :: Tree a -> [a]

-- Bottom of the tree, nothing to see here
tree Empty = []

-- Append left subtree, self and right subtree
tree (Node x l r) = (tree l) ++ [x] ++ (tree r) 

-- prints [4, 2, 5, 1, 3]
main =
    let t1 = Node 2 (Node 4 Empty Empty) (Node 5 Empty Empty)
        t2 = (Node 3 Empty Empty)
        t = Node 1 t1 t2
    in print $ tree t 

您可以打开
DeriveFoldable
功能,让Haskell为您完成以下工作:

{-# LANGUAGE DeriveFoldable #-}

data Tree a = Node (Tree a) a (Tree a) | Empty deriving Foldable
您不仅可以将树转换为列表,还可以使用可折叠文件的功能,例如:

Prelude Data.Foldable> sum (Node (Node Empty 4 Empty) 2 (Node Empty 5 Empty))
11
Prelude Data.Foldable> product (Node (Node Empty 4 Empty) 2 (Node Empty 5 Empty))
40
Prelude Data.Foldable> length (Node (Node Empty 4 Empty) 2 (Node Empty 5 Empty))
3
Prelude Data.Foldable> minimum (Node (Node Empty 4 Empty) 2 (Node Empty 5 Empty))
2
Prelude Data.Foldable> maximum (Node (Node Empty 4 Empty) 2 (Node Empty 5 Empty))
5

您可以打开
DeriveFoldable
功能,让Haskell为您完成以下工作:

{-# LANGUAGE DeriveFoldable #-}

data Tree a = Node (Tree a) a (Tree a) | Empty deriving Foldable
您不仅可以将树转换为列表,还可以使用可折叠文件的功能,例如:

Prelude Data.Foldable> sum (Node (Node Empty 4 Empty) 2 (Node Empty 5 Empty))
11
Prelude Data.Foldable> product (Node (Node Empty 4 Empty) 2 (Node Empty 5 Empty))
40
Prelude Data.Foldable> length (Node (Node Empty 4 Empty) 2 (Node Empty 5 Empty))
3
Prelude Data.Foldable> minimum (Node (Node Empty 4 Empty) 2 (Node Empty 5 Empty))
2
Prelude Data.Foldable> maximum (Node (Node Empty 4 Empty) 2 (Node Empty 5 Empty))
5

@休谟,谢谢你,虽然这还远远不够。我不明白为什么这被否决了?这是一个能正常工作的好解决方案。@WillemVanOnsem也许人们更喜欢你的解决方案的泛型,我倾向于同意。不过,两者都有理由。@bereal:我认为两者都展示了不同的东西:你的解决方案展示了如何做到这一点。导出可折叠的
只是将其自动化。但是,仍然了解正在发生的事情,以及在哪些情况下实施会导致效率低下,等等,这始终是一个好主意。@Hume谢谢你,尽管这离实际情况相去甚远。我不明白这为什么会被否决?这是一个能正常工作的好解决方案。@WillemVanOnsem也许人们更喜欢你的解决方案的泛型,我倾向于同意。不过,两者都有理由。@bereal:我认为两者都展示了不同的东西:你的解决方案展示了如何做到这一点。导出可折叠的
只是将其自动化。但是,仍然了解正在发生的事情,以及在哪些情况下实现会导致效率低下,等等,这始终是一个好主意。@bereal:老实说,我认为这比两个答案都收到dv要好:PI不知道有一个
派生折叠式
!这看起来是一个相对较新的功能(GHC 7.12)。@bereal:老实说,我认为这比两个答案都收到的dv要好:PI不知道有一个
派生折叠式
!这似乎是一个相对较新的功能(GHC 7.12)。