foldM
Data.Foldableにある
https://hackage.haskell.org/package/base-4.18.0.0/docs/Data-Foldable.html#v:foldlM
定義
code:hs
foldlM :: (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を具体化して、もっとわかりやすく書くと
code:hs
foldlM :: (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
例
code:hs
>> let f a e = do { print e ; return $ e : a }
>> foldlM f [] 0..3
0
1
2
3
3,2,1,0
以下2つは同じ
code:hs
foldM f a1 x1, x2, ..., xm
code:hs
do
a2 <- f a1 x1
a3 <- f a2 x2
...
f am xm
https://xtech.nikkei.com/it/article/COLUMN/20091009/338681/?P=4