我想用不同的值标记树的每个元素(Int,例如清酒).我设法做到这一点,但代码是丑陋的野兽,我不知道如何使用Monads.
我的看法:
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)
Run Code Online (Sandbox Code Playgroud)
你知道更好的方法吗?
编辑: 我刚才意识到上面的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 ff@((f,_),_) = …Run Code Online (Sandbox Code Playgroud) Python 列表中的枚举可以写成zip [0..].我查看了Control.Lens.Traversal和Control.Lens.Indexed,但我无法弄清楚如何使用镜头将其概括为任何合理的容器(我犹豫说"Traversable").
我猜itraverse或是itraverseOf关键.