裝飾樹我想在樹上的每一個元素標記不同的值(智力,例如緣故)。我成功地做到這一點,但代碼是醜陋的野獸,我不知道如何與單子還沒有工作。如何在Haskell
我的看法:
data Tree a = Tree (a, [Tree a])
tag (Tree (x, l)) n = ((m, x), l')
where (m,l') = foldl g (n,[]) l
where g (n,r) x = let ff = tag x n in ((fst $ fst ff) +1, (Tree ff):r)
你知道一些更好的辦法?
編輯: 我剛剛意識到,上述foldl真的是mapAccumL。所以,這裏是以上清理版本:
import Data.List (mapAccumL)
data Tree a = Tree (a, [Tree a])
tag (Tree (x, l)) n = ((m,x),l')
where (m,l') = mapAccumL g n l
g n x = let [email protected]((f,_),_) = tag x n in (f+1,ff)
注意mapAccumL是一樣的MAPM爲國家單子,如果刪除了newtypes。所以每當你使用mapAccumL,考慮使用狀態單子。 –