【问题标题】:Haskell: Deriving a list from a P-TreeHaskell:从 P-Tree 派生列表
【发布时间】:2018-10-04 11:11:30
【问题描述】:

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

我有一个构建 P-trees 的数据类型,一棵有 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] 的列表。有人可以给我一个线索来解决这个问题并引导我走上正确的道路。

【问题讨论】:

    标签: haskell tree


    【解决方案1】:
    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 需要两个 PTrees 而不是列表。请考虑:

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

    【讨论】:

    • 假设我希望 PNode 获取一个列表(这样我可以拥有可变数量的节点),PTree 的签名会看起来像这样吗? data KTree a = KLeaf a | KNode [(KTree a)] deriving Show ?如果我将我的数据结构修改为这样,我将如何更改我的 pList 函数?
    • 当我写这样的东西时kLeafList :: (Ord a) => KTree a -> [a] kLeafList (KLeaf a) = [a] kLeafList (KNode [left,right]) = kLeafList left ++ kLeafList right 它给了我想要的答案,但这只能处理一个有 2 个节点的列表。我该如何制作这个变量。?
    • 好的,所以现在我有了这个kLeafList :: (Ord a) => KTree a -> [a] kLeafList (KLeaf a) = [a] kLeafList (KNode (x:xs)) = kLeafList x ++ kLeafList (KNode xs) 当我运行它时,它给了我我需要的答案 [5,6,7,8 **** 例外:函数中的非详尽模式.我似乎看不出我缺少哪种模式。
    • @Kaylo 我建议打开-Wall。它会帮助你避免一些错误。它会告诉你你错过了KNode [] 案例。您还可以使用 concatMap 或列表推导完全避免在列表上匹配。
    • @HTNW 哇,谢谢。我的代码中有很多错误。大声笑
    猜你喜欢
    • 2015-05-20
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 2017-08-13
    • 1970-01-01
    相关资源
    最近更新 更多