我尝试通过一棵树来总结所有路径,该树将每个级别从根扩展到最低子级 1 到 10 倍。
我的函数递归地遍历所有 child ,但是我遇到的问题是,当我尝试制作节点列表并在列表中执行此列表时,我变成了一个列表的列表......列表的列表。
我认为我的问题是组合步骤我试图制作一种模式匹配方法,但是当它变成列表列表时应该比较列表的方法,并且应该创建新列表并比较它们,如果它只是一种方式(满足列表与节点而不是带有列表的列表)不起作用。

最佳答案

summarize :: Tree a -> [[a]]
summarize Leaf = [[]]
summarize (Node a t1 t2) = do
    t <- [t1, t2]
    map (a:) (summarize t)

编辑:请注意,以上假设 Tree 具有以下定义:
data Tree a = Leaf | Node a (Tree a) (Tree a)

编辑 #2:此版本的代码可能更清晰:
summarize :: Tree a -> [[a]]
summarize Leaf = [[]]
summarize (Node a t1 t2) = do
    t       <- [t1, t2]
    summary <- summarize t
    return (a:summary)

这个版本有一个很好的特性,它可以写成一个列表推导式:
summarize (Node a t1 t2) = [a:summary | t <- [t1, t2], summary <- summarize t]

关于Haskell 总结通过树的所有路径,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17503564/

10-12 17:36