這個問題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
提供的在另一個答案lution也沒有產生任何輸出:
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
有關。
由於輸出是2維列表。我可以同時運行2維take
和具有深度限制或寬度限制或兩者的項目!
任何幫助表示讚賞!
在審查了答案後,再想一想。我意識到這是可以展開的,因爲產生的列表是,不計其數無限。這是因爲深度玫瑰樹的無限深度不是2維數據結構,而是無限維數據結構。每個深度級別都賦予一個額外的維度。換句話說,它有點相當於一個無限維矩陣,設想一個矩陣,其中每個場是另一個矩陣。ad-infinitum。無限矩陣的基數是infinity^infinity
,這已被證明(我認爲)是無數無限的。這意味着任何無限維度的數據結構在實際意義上都不是真正可計算的。
要將此應用於玫瑰樹,如果我們具有無限深度,那麼路徑永遠不會經過玫瑰樹的最左邊。這就是這棵樹:
0
|
|
[1,2..]
/\
/ \
/ \
[2,3..] [2,3..]
會產生類似的路徑:[[0,1,2..], [0,1,2..], [0,1,2..]..]
,我們從來沒有闖過[0,1,2..]
。
或者換句話說,如果我們有一個包含列表ad-infinitum的列表。我們也可以不計算(枚舉)它,因爲代碼會跳到無限大的維度。
這也與實數有一些關係,無數無限。在一個懶惰的無限實數列表中,只會無限地產生0.000..
,永遠不會枚舉過去。
我不知道如何形式化上述解釋,但這是我的直覺。 (僅供參考,請參閱:https://en.wikipedia.org/wiki/Uncountable_set)看到有人擴大應用https://en.wikipedia.org/wiki/Cantor's_diagonal_argument來解決這個問題,這將很酷。
我會注意到,如果讓結果成爲類似於'rindex'的函數,那麼* *可以摺疊無限深度和無限寬度樹,除了無限索引列表。 –
你如何定義深度?所有路徑長度的上限?如果所有路徑都是有限的(但可能是無限的長度),那麼路徑的數量是可數的(只要每個節點的寬度是可數的)。 –
@ j.p。那是個很好的觀點。 – ErikR