【问题标题】:Find Root and Root Children of Rose Tree in Haskell在 Haskell 中查找玫瑰树的根和根子节点
【发布时间】:2016-03-21 11:38:24
【问题描述】:

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

http://bit.ly/1YdoEhh

玫瑰树是用以下符号定义的

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

并且根可以简单地检测为

root (a :> rs) = a

我想用函数的表达式(用“:>”表示节点)来查找根的孩子。 此函数子项的预期行为示例

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

谁能帮帮我? 谢谢!

【问题讨论】:

  • 在以后的问题中,请不要使用 URL 缩短器,并添加有关您的问题的足够信息,以便我们无需寻找其他地方即可回答。

标签: haskell tree


【解决方案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

【讨论】:

  • 谢谢,但您能否根据最新版本的帖子(以及节点的符号)调整您的答案?
猜你喜欢
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多