Chcę oznaczyć każdy element drzewa o innej wartości (Int, na przykład sake). Udało mi się to zrobić, ale kod jest brzydki jak bestia i nie wiem jeszcze, jak pracować z Monadami.Jak ozdobić drzewo w Haskell
My się:
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)
Znasz jakiś lepszy sposób?
EDYCJA: Właśnie sobie sprawę, że powyższe foldl naprawdę jest mapAccumL. Więc tutaj jest czyszczony wersja powyższego:
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)
Zauważ, że mapAccumL jest taka sama jak mapM dla monady państwowej, jeśli usuniesz nowe typy. Więc kiedy użyjesz mapAccumL, rozważ użycie monady stanu. –