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 - Fatal编程技术网

Haskell 如何在常规树的特定级别打印节点列表?

Haskell 如何在常规树的特定级别打印节点列表?,haskell,Haskell,我得到了以下树定义和函数: data Tree a = Node a [Tree a] deriving (Eq, Read, Show) treeRoot :: Tree a -> a treeRoot (Node a _) = a treeSubtrees :: Tree a -> [Tree a] treeSubtrees (Node _ subtrees) = subtrees 我需要创建一个函数“nodesAtLevel”,它接受两个参数:一个树和一个整数n>=0。函

我得到了以下树定义和函数:

data Tree a = Node a [Tree a] deriving (Eq, Read, Show)

treeRoot :: Tree a -> a
treeRoot (Node a _) = a

treeSubtrees :: Tree a -> [Tree a]
treeSubtrees (Node _ subtrees) = subtrees
我需要创建一个函数“nodesAtLevel”,它接受两个参数:一个树和一个整数n>=0。函数需要返回给定级别n的所有节点的列表。树的根是级别0。我对Haskell很陌生,是的,这是家庭作业的一部分,所以如果你能帮助我完成这项任务的思考过程,我将不胜感激!我目前对“nodesAtLevel”函数的定义编写如下:

nodesAtLevel :: Int -> Tree a -> [a]

好的,让我们一步一步来讨论这个问题(现在给您留下一些漏洞):

级别为0的节点 据我所知,您只能在此处返回根值(当然是在列表中)

那么这里的
是什么

nodesAtLevel 0 (Node a subtrees) = ...
更深层次的节点 这个结构是很好的递归结构,所以我们可能想使用递归

因此,让我们递归地更深一层(减少我们剩下的路-也就是我们的
n

但是有一个小问题:
nodesAtLevel
作用于单个节点,但我们只剩下一个节点列表(子树
)。。那怎么办呢

也许我们应该为每个子树/子节点做些什么-因此我们需要在这里找到正确的函数
f
(提示您可能需要映射和合并结果…):

那是什么?你能猜到吗?如果不是的话,也许你可以自己写


其他提示: 也许你应该先找出
f
的类型,因为这样你甚至可以用它来找到合适的

如果您使用较新的GHC版本,您可以让编译器在您编写

nodesAtLevel n (Node _ subtrees) = _f (nodesAtLevel (n-1)) subtrees
其中
\u f
是一个-现在,如果您将其加载到GHCi中,它将为您提供一个

Found hole ‘_f’ with type: ....
附加信息批次错误;)


所以只要找到
f
就可以了;)

顺便说一句您可以使用已有的函数,而不是像我一样再次使用模式匹配,但我觉得这样更容易看到结果-因此,如果您遵循此路径,则不需要使用
树子树
树子树


解决方案
  • ..
    =
    [a]
  • f
    =
因此,一种可能的方法是:

nodesAtLevel :: Int -> Tree a -> [a]
nodesAtLevel 0 (Node a _) = [a]
nodesAtLevel n (Node _ subtrees) = concatMap (nodesAtLevel (n-1)) subtrees

好的,下一步:尝试实现
节点级别0
。然后,在
nodesatalevel(n-1)
的函数中写入
nodesatalevel n
。堆栈溢出不是“如何从头开始编写”之类问题的好地方。我建议您尝试实现您正在询问的功能,然后当您遇到问题时,询问特定的子问题。如果您愿意,可以尝试我的答案-我将尝试回答有关该问题的评论/问题,但不会太多,稍后再回来填补漏洞(做一个完整的答案)
nodesAtLevel :: Int -> Tree a -> [a]
nodesAtLevel 0 (Node a _) = [a]
nodesAtLevel n (Node _ subtrees) = concatMap (nodesAtLevel (n-1)) subtrees