我来自命令式语言的背景,因此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]的清单。有人可以帮我弄清楚这个问题,并引导我走上正确的道路。
答案 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]
。您的方式使PLeaf
和a
成为独立的参数,而不是在单个参数上进行模式匹配。
pList (PNode [PLeaf 5, PLeaf 6, PLeaf 7, PLeaf 8])
嗯...在上方,您已经显示PNode
需要两个PTree
,而不是一个列表。请考虑:
PNode (PNode (PLeaf 5) (PLeaf 6)) (PNode (PLeaf 7) (PLeaf 8))