2014-01-09 75 views
1

這對於將修改給定的路徑和新的價值樹的特定節點的功能的僞代碼:如何使用fold實現深度樹算法?

path_set val path tree = 
    | empty? path -> val 
    | otherwise -> set (path_set val (tail path) (get tree (head path))) tree 

例如,

path_set 50 [1 1] [[1 1] [1 1]] = [[1 1] [1 50]] 

怎麼能這個算法可以實現使用折?

+0

摺疊可能不是最好的方式來做到這一點。摺疊通常用於迭代應用,而不是遞歸。您還沒有定義,你也可能會想要什麼樣的樹,什麼都者的這條道路代表等來實現樹作爲它自己的數據類型,因爲列表不能任意嵌套在Haskell,分公司有可以說,深度相同。 – bheklilr

+1

如果你想摺疊做到這一點,你需要一個拉鍊。實際上,LYAH教程有一個關於拉鍊的頁面,並且解決了幾乎這個確切的問題:根據方向列表在樹中移動。 http://learnyouahaskell.com/zippers所以,你可以做一個摺疊,但它可能不會更乾淨或更快,因爲你給的代碼已經非常簡單。 – user2407038

回答

1

嗯,沒人接,這裏是我的解決方案:

(λ (λ (λ (foldr (λ (λ (set B (get 0 A) (get 1 A)))) C ((λ (λ (foldl (λ (λ (conc B (list ((list (A (if (eq (len B) 0) C (get (get 0 (last B)) (get 1 (last B))))))))))) (list) B))) B A))))) 

在與字母升序字母和濃 - 列出編碼德布魯因指數的演算。

這真的不是最理想的,但對我的用例來說工作正常,因爲它幾乎總是在編譯時減少(當你想調用set時,幾乎總是有路徑定義)。