我制作了以下 N 叉树数据类型:
data Tree a = Leaf a | Node a [Tree a] deriving (Show)
使用以下方法:
listLeaf::Tree a -> [a]
listLeaf (Leaf a) = [a]
listLeaf (Node a (l:list)) = concat $ listLeaf l
我正在尝试创建 listLeaf,以便它为我提供一个列表,其中包含树中叶子的每个元素。这意味着如果我有以下树:Node 3 [Leaf 1, Leaf 2, Node 1 [Leaf 3]]
,我的目标是得到 [1,2,3]。
正如您可能注意到的那样,我的函数的类型没有相加,因为它需要一个 a 列表,但我给它一个列表列表。 我无法理解如何让基本情况(叶)返回我一个类型 [a],同时让节点情况给我相同类型的类型。我觉得除了 concat 之外我还需要使用更高阶的函数,但我没有任何线索。 有什么提示吗?
最佳答案
您在这里仅对列表的第一个元素 l
调用 listLeaf
,因此您只会获得最左边 叶子。此外,concat
没有多大意义,因为您有一个值列表,而不是一个值列表列表。
您可以使用concatMap :: (a -> [b]) -> [a] -> [b]
对所有元素执行映射并连接结果列表,因此:
listLeaf :: Tree a -> [a]
listLeaf (Leaf a) = [a]
listLeaf (Node _ <b>cs</b>) = <b>concatMap</b> listLeaf cs
关于haskell - 不知道如何正确输入我的 N 叉树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65149658/