在Haskell找到玫瑰树的根和子根

时间:2015-12-15 15:39:53

标签: haskell tree

我希望能够完全回答有关如何找到玫瑰树的根和子的问题。 第一部分(如何找到根目录)已基本回答了stackoverflow

http://bit.ly/1YdoEhh

玫瑰树用以下符号定义

data Rose a = a :> [Rose a]
deriving (Eq, Show)

,根目录可以简单地检测为

root (a :> rs) = a

我希望函数的表达式(使用":>"节点的表示法)来查找根的子节点。 此函数children的预期行为示例

children (1 :> [2 :> [], 3 :> []]) = [2 :> [], 3 :> []] 

任何人都可以帮助我吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

它只是模式匹配第二个参数而不是第一个参数。鉴于声明:

data Rose x = Rose x [Rose x] deriving (Show, Eq)

我们可以写:

root :: Rose x -> x
root (Rose x _) = x

children :: Rose x -> [Rose x]
children (Rose _ rs) = rs

或者我们可以通过使用"记录符号"来编写此代码来节省一些麻烦。并将这两个隐式定义为:

data Rose x = Rose {root :: x, children :: [Rose x]} deriving (Show, Eq)

(但不要被愚弄!root没有类型x,而是像以前一样输入Rose x -> x,它只是Rose x ->被认为是多余的而不是写的!)

如果您不想要[Rose x]而只想[x]怎么办?然后,您希望使用root函数转换列表的每个元素,该函数将元素放在玫瑰树中的当前单元格中。这"用函数"转换每个元素。对于列表或map,函数通常称为fmap。因此,如果您的树名为map root (children roseTree),则只需编写roseTree即可获得[x]。我们可以直接用函数组合运算符.来编写它:

childElements :: Rose x -> [x]
childElements = map root . children