Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Haskell中找到玫瑰树的根和根子树_Haskell_Tree - Fatal编程技术网

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

在Haskell中找到玫瑰树的根和根子树,haskell,tree,Haskell,Tree,我希望能够完全回答关于如何找到玫瑰树的根和子树的问题。 第一部分(如何找到根)基本上已经在这里的stackoverflow上得到了回答 玫瑰树用以下符号定义 data Rose a = a :> [Rose a] deriving (Eq, Show) 根可以简单地检测为 root (a :> rs) = a 我希望使用函数的表达式(用“:>”表示节点)来查找根的子级。 此函数子级的预期行为示例 children (1 :> [2 :> [], 3 :> []

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

玫瑰树用以下符号定义

data Rose a = a :> [Rose a]
deriving (Eq, Show)
根可以简单地检测为

root (a :> rs) = a
我希望使用函数的表达式(用“:>”表示节点)来查找根的子级。 此函数子级的预期行为示例

children (1 :> [2 :> [], 3 :> []]) = [2 :> [], 3 :> []] 
有人能帮我吗?
谢谢

它只是模式匹配第二个参数,而不是第一个参数。鉴于宣言:

data Rose x=Rose x[Rose x]推导(显示,等式)
我们可以写:

root::Rose x->x
根(玫瑰x_uux)=x
儿童::玫瑰x->[玫瑰x]
儿童(玫瑰色)=卢比
或者,我们可以通过使用“记录符号”来编写此文件,并隐式地将这两个定义为:

data Rose x=Rose{root::x,children::[Rose x]}派生(Show,Eq)
(但别被愚弄了!
root
没有type
x
但是type
Rose x->x
和以前一样,只是
Rose x->
被认为是冗余的,没有被写入!)

如果您不想要一个
[Rose x]
,而只想要一个
[x]
,该怎么办?然后,您需要使用
root
函数转换列表中的每个元素,该函数获取玫瑰树中当前单元格中的元素。这种“用函数变换每个元素”的函数通常称为列表的
map
,或
fmap
。因此,如果您的树被称为
roseTree
,您可以简单地编写
map root(children-roseTree)
,以获得
[x]
。我们可以直接使用函数组合运算符
将其编写为:

childElements::Rose x->[x]
childElements=映射根。儿童

在将来的问题中可能会出现重复的问题,请不要使用URL缩写,并添加足够的问题信息,以便我们可以在不查看其他地方的情况下进行回答。谢谢,但是您能否将您的答案调整为最新版本的帖子(以及节点的标记)?