Haskell Can';我不知道如何正确地键入我的N元树

Haskell Can';我不知道如何正确地键入我的N元树,haskell,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,Le

我创建了以下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]

正如您可能注意到的那样,我的函数的类型没有加起来,因为它需要一个列表,但我给它一个列表。 我不知道如何让基本case(leaf)返回类型[a],同时让节点case给我相同的类型。我觉得除了concat之外,我还需要使用一个高阶函数,但我没有得到任何线索。
有什么提示吗?

您在这里只调用列表的第一个元素
l
上的
listLeaf
,因此您将只获得最左边的叶子。因为你有一个值的列表,而不是一个值的列表,所以进一步的MOR
concat
就没有什么意义了

可以使用对所有元素执行映射,并连接结果列表,以便:

listLeaf :: Tree a -> [a]
listLeaf (Leaf a) = [a]
listLeaf (Node _ cs) = concatMap listLeaf cs
listLeaf::树a->[a]
listLeaf(叶a)=[a]
listLeaf(节点cs)=concatMap listLeaf cs