【发布时间】:2016-01-12 17:49:21
【问题描述】:
这个问题haskell fold rose tree paths 深入研究了将玫瑰树折叠到其路径的代码。我正在试验无限玫瑰树,我发现提供的解决方案不够懒惰,无法在深度和广度都无限的无限玫瑰树上工作。
考虑一棵玫瑰树,例如:
data Rose a = Rose a [Rose a] deriving (Show, Functor)
这是一棵有限的玫瑰树:
finiteTree = Rose "root" [
Rose "a" [
Rose "d" [],
Rose "e" []
],
Rose "b" [
Rose "f" []
],
Rose "c" []
]
边缘路径列表的输出应该是:
[["root","a","d"],["root","a","e"],["root","b","f"],["root","c"]]
这是一棵二维的无限玫瑰树:
infiniteRoseTree :: [[a]] -> Rose a
infiniteRoseTree ((root:_):breadthGens) = Rose root (infiniteRoseForest breadthGens)
infiniteRoseForest :: [[a]] -> [Rose a]
infiniteRoseForest (breadthGen:breadthGens) = [ Rose x (infiniteRoseForest breadthGens) | x <- breadthGen ]
infiniteTree = infiniteRoseTree depthIndexedBreadths where
depthIndexedBreadths = iterate (map (+1)) [0..]
这棵树是这样的(只是摘录,有无限的深度和无限的广度):
0
|
|
[1,2..]
/ \
/ \
/ \
[2,3..] [2,3..]
路径看起来像:
[[0,1,2..]..[0,2,2..]..]
这是我最近的尝试(在 GHCi 上执行此操作会导致无限循环,没有流输出):
rosePathsLazy (Rose x []) = [[x]]
rosePathsLazy (Rose x children) =
concat [ map (x:) (rosePathsLazy child) | child <- children ]
rosePathsLazy infiniteTree
另一个答案中提供的解决方案也没有产生任何输出:
foldRose f z (Rose x []) = [f x z]
foldRose f z (Rose x ns) = [f x y | n <- ns, y <- foldRose f z n]
foldRose (:) [] infiniteTree
上述两种方法都适用于有限玫瑰树。
我尝试了许多变体,但我无法弄清楚如何让无限二维玫瑰树的边缘折叠操作变得惰性。我觉得这与无限量的concat有关。
因为输出是一个二维列表。我可以运行二维take 并同时使用深度限制或广度限制进行投影!
感谢任何帮助!
在查看了这里的答案并进行了更多思考之后。我意识到这是可展开的,因为结果列表是无数无限的。这是因为无限深度和广度玫瑰树不是二维数据结构,而是无限维数据结构。每个深度级别都赋予一个额外的维度。换句话说,它在某种程度上相当于一个无限维矩阵,想象一个矩阵,其中每个字段都是另一个矩阵.. ad-infinitum。无限矩阵的基数是infinity ^ infinity,它已被证明(我认为)是不可数无限的。这意味着任何无限维数据结构在有用的意义上都不是真正可计算的。
要将这个应用到玫瑰树,如果我们有无限的深度,那么路径永远不会枚举到玫瑰树的最左边。那就是这棵树:
0
|
|
[1,2..]
/ \
/ \
/ \
[2,3..] [2,3..]
会产生类似[[0,1,2..], [0,1,2..], [0,1,2..]..] 的路径,而我们永远无法通过[0,1,2..]。
或者以另一种方式,如果我们有一个包含无限列表的列表。我们也永远无法计算(枚举)它,因为代码会跳转到无数个维度。
这也与不可数无限的实数有关。在无限实数的惰性列表中,只会无限产生0.000..,并且永远不会枚举过去。
我不确定如何将上述解释形式化,但这是我的直觉。 (供参考:https://en.wikipedia.org/wiki/Uncountable_set)看到有人扩展将https://en.wikipedia.org/wiki/Cantor's_diagonal_argument 应用于此问题会很酷。
【问题讨论】:
标签: algorithm haskell tree lazy-evaluation fold