Haskell:从P树导出列表

时间:2018-10-04 02:39:17

标签: haskell tree

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

我有一个构建P树的数据类型,这是一个有p个子树的树。除了叶子具有值而内部节点没有值之外,它类似于二叉树。

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

data PTree a = PNode (PTree a) (PTree a) | PLeaf a
   deriving Show

我想编写一个函数,该函数接受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]的清单。有人可以帮我弄清楚这个问题,并引导我走上正确的道路。

1 个答案:

答案 0 :(得分:6)

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]。您的方式使PLeafa成为独立的参数,而不是在单个参数上进行模式匹配。

pList (PNode [PLeaf 5, PLeaf 6, PLeaf 7, PLeaf 8])

嗯...在上方,您已经显示PNode需要两个PTree,而不是一个列表。请考虑:

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