我希望能够完全回答有关如何找到玫瑰树的根和子的问题。 第一部分(如何找到根目录)已基本回答了stackoverflow
玫瑰树用以下符号定义
data Rose a = a :> [Rose a]
deriving (Eq, Show)
,根目录可以简单地检测为
root (a :> rs) = a
我希望函数的表达式(使用":>"节点的表示法)来查找根的子节点。 此函数children的预期行为示例
children (1 :> [2 :> [], 3 :> []]) = [2 :> [], 3 :> []]
任何人都可以帮助我吗? 谢谢!
答案 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