我获得了以下树的定义和功能:
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 :(得分:3)
好的,让我们一步一步(暂时留下一些漏洞):
据我所知,你只想在这里返回根值(当然在列表中)
那么...
会发生什么?
nodesAtLevel 0 (Node a subtrees) = ...
结构很好地递归,所以我们可能想要使用递归。
因此,让我们更深层次地递归更深层次(减少我们离开的方式 - 也就是我们的n
)
但是有一个小问题:nodesAtLevel
作用于单个节点,但我们只剩下一个节点列表(subtrees
)..那该怎么办?
好吧也许我们应该为每个子树/子节点做一些 - 所以我们需要在这里找到正确的函数f
(提示你可能想要的 map 和 concat 结果......):
nodesAtLevel n (Node a subtrees) = f (nodesAtLevel (n-1)) subtrees
f
可以是什么?你能猜到吗?也许你自己可以自己写呢?
也许你应该首先找出类型 f
有什么 - 因为那样你甚至可以使用Hoogle来找到合适的人选。
如果您使用较新的GHC版本,那么如果您编写
,请让编译器完成工作nodesAtLevel n (Node _ subtrees) = _f (nodesAtLevel (n-1)) subtrees
其中_f
是漏洞 - 现在,如果你在GHCi中加载它,它会给你一个
Found hole ‘_f’ with type: ....
很多其他信息的错误;)
所以只需找到...
和f
,这应该有用;)
BTW 您可以像我一样使用您已经拥有的功能而不是模式匹配,但我觉得通过这种方式更容易看到结果 - 所以,如果您按照路径进行操作,则不需要使用treeSubtrees
或treeRoot
...
= [a]
f
= concatMap
所以一种可行的方法就是:
nodesAtLevel :: Int -> Tree a -> [a]
nodesAtLevel 0 (Node a _) = [a]
nodesAtLevel n (Node _ subtrees) = concatMap (nodesAtLevel (n-1)) subtrees