haskell - 不知道如何正确输入我的 N 叉树

标签 haskell

我制作了以下 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/

相关文章:

haskell - 如何在 GHCi 重新加载之间保持环境?

Haskell 递归 IO

haskell - 为大输入返回负数的阶乘函数

haskell - 使用 `no-code` 标志时 ghc 不报告非详尽模式匹配

graphics - 树可视化和动画

haskell - 如何在函数中使用 getStdGen

haskell - 使用 >>= 运算符时约束中的非类型变量参数

haskell - 学习 haskell `parsec` : trying to rewrite `words` function as a basic exercise

haskell - 尝试简单的单例示例时出现模板 Haskell 错误

为有限列表使用 foldl' 实现 concatMap 的性能提升?