将树缩减为haskell中的列表

时间:2015-11-19 22:44:10

标签: haskell

我正在尝试将树缩减为列表,但我被困在这里......任何建议都值得赞赏..

data Tree a = Leaf a | Node (Tree a) a (Tree a) deriving (Eq, Show)
treeToList :: (Ord a) => Tree a -> [a]
treeToList (Node root left right) = treeToList left ++ [root] ++   treeToList right

期待结果:

ghci> treeToList (Node (Leaf 1) 2 (Node (Leaf 3) 4 (Leaf 5)))

[1,2,3,4,5]

2 个答案:

答案 0 :(得分:6)

您有两个错误:

  1. 非详尽模式(适用于Leaf构造函数)。
  2. Node的模式中,您将root与左树值(Tree a)匹配,而不是a
  3. 因此结果应该如下:

    data Tree a = Leaf a | Node (Tree a) a (Tree a) deriving (Eq, Show)
    
    treeToList :: (Ord a) => Tree a -> [a]
    treeToList (Leaf v) = [v]
    treeToList (Node left root right) = treeToList left ++ [root] ++ treeToList right
    
    *Main> treeToList (Node (Leaf 1) 2 (Node (Leaf 3) 4 (Leaf 5)))
    [1,2,3,4,5]
    

答案 1 :(得分:3)

对m0nhawk的绝对正确答案进行评论,我会提出以下建议。当你编写一个函数,模式匹配代数数据类型如Tree时,首先编写一个函数将如何构造的模板。在这种情况下,给定类型定义:

data Tree a = Leaf a | Node (Tree a) a (Tree a) deriving (Eq, Show)

...和这个函数签名:

treeToList :: (Ord a) => Tree a -> [a]

...你可以从编写像这样的模板开始,这只是扩展了Tree类型及其组件的两种选择:

treeToList (Leaf value) = _
treeToList (Node left value right) = _

_(下划线)读作“空白”以便稍后填写。这在最近的GHC版本中实际上是有效的语法,称为“漏洞”,因此编译器会提醒您需要填写它。

通过写出这样的模板并确保覆盖所使用类型的所有替代方案,您可以大大降低遇到问题#1的风险,m0nhawk指出。