hsfoldlM :: (Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m b
foldlM f z0 xs = foldr f' return xs z0
where f' x k z = f z x >>= k
t
を具体化して、もっとわかりやすく書くとhsfoldlM :: (Monad m) => (b -> a -> m b) -> b -> [a] -> m b
foldlM _ acc [] = return acc
foldlM f acc (x:xs) = do
acc' <- f acc x
foldlM f acc' xs
hs>>> let f a e = do { print e ; return $ e : a }
>>> foldlM f [] [0..3]
0
1
2
3
[3,2,1,0]
hsfoldM f a1 [x1, x2, ..., xm]
hsdo
a2 <- f a1 x1
a3 <- f a2 x2
...
f am xm