Haskell:从P树导出列表

Haskell:从P树导出列表,haskell,tree,Haskell,Tree,我来自命令式语言的背景,所以Haskell和函数式编程对我来说是一个相当新的概念 我有一个数据类型可以构建p-树,一个包含p个子树的树。它类似于二叉树,只是叶子有值,但内部节点没有 这是我提出的数据类型(如果我错了,请纠正我) 我想写一个函数,它接收PTree并返回树中元素的列表。这就是我到目前为止的想法 pList :: (Ord a) => PTree a -> [a] pList PLeaf a = [a] pList (PNode left right) = pList l

我来自命令式语言的背景,所以Haskell和函数式编程对我来说是一个相当新的概念

我有一个数据类型可以构建p-树,一个包含p个子树的树。它类似于二叉树,只是叶子有值,但内部节点没有

这是我提出的数据类型(如果我错了,请纠正我)

我想写一个函数,它接收PTree并返回树中元素的列表。这就是我到目前为止的想法

pList :: (Ord a) => PTree a -> [a]
pList PLeaf a = [a]
pList (PNode left right)  = pList left ++ pList right
我没有得到我想要的结果。例如,如果我尝试在ghci中运行以下代码

pList (PNode [PLeaf 5, PLeaf 6, PLeaf 7, PLeaf 8])
我希望得到[5,6,7,8]的列表。有人能给我一个线索,让我明白这一点,并引导我走上正确的道路

data PTree a = PNode (PTree a) (PTree a) | PLeaf a
                   --   ^ One    ^ Two
   deriving Show
这里的
PTree
是一个树,其中每个内部节点都有两个子节点(请参见“一”和“二”),并且内部节点不携带
a
类型的值。PTree没有P个子节点-每个节点有两个子节点。类型未指定总叶数

pList :: (Ord a) => PTree a -> [a]
pList PLeaf a = [a]
pList (PNode left right)  = pList left ++ pList right
接近!请尝试
pList(PLeaf a)=[a]
。您的方式使
PLeaf
a
成为独立的参数,而不是在单个参数上进行模式匹配

pList (PNode [PLeaf 5, PLeaf 6, PLeaf 7, PLeaf 8])
嗯。。。。不那么接近。上面已经显示了
PNode
需要两个
PTree
s,而不是一个列表。考虑一下:

PNode (PNode (PLeaf 5) (PLeaf 6)) (PNode (PLeaf 7) (PLeaf 8))

假设我想让PNode获取一个列表(这样我就可以拥有一个可变数量的节点),那么
PTree
的签名会像这样吗<代码>数据KTree a=KLeaf a | KNode[(KTree a)]导出显示?如果我把数据结构修改成这样,我将如何改变pList函数?当我写这样的东西时,
kLeafList::(Ord a)=>KTree a->[a]kLeafList(kLeafList)(KNode[left,right])=kLeafList left++kLeafList right
它给了我想要的答案,但这只处理具有2个节点的列表。如何生成这个变量?好的,现在我有了这个
kLeafList::(orda)=>ktreea->[a]kLeafList(kLeafList)(kLeafList)(KNode(x:xs))=kLeafList x++kLeafList(KNode xs)
当我运行它时,它会给出我需要的答案[5,6,7,8****异常:函数中的非穷举模式。我似乎看不出缺少哪个模式。@Kaylo我建议打开
-Wall
。这将帮助您避免一些错误。它会告诉您缺少
KNode[]
case。您也可以使用
concatMap
或列表理解避免在列表中完全匹配。@HTNW噢,哇,谢谢。我的代码中有很多错误。哈哈
PNode (PNode (PLeaf 5) (PLeaf 6)) (PNode (PLeaf 7) (PLeaf 8))