我正在寻找一种在 IO monad 中使用 mapAccumL 的方法 - 类似于 mapM 的类似物,即具有这种类型签名:
mapAccumLM :: (Monad m) => (a -> b -> m(a, c)) -> a -> [b] -> m(a, [c])
有什么简单的方法可以做到这一点?
我正在寻找一种在 IO monad 中使用 mapAccumL 的方法 - 类似于 mapM 的类似物,即具有这种类型签名:
mapAccumLM :: (Monad m) => (a -> b -> m(a, c)) -> a -> [b] -> m(a, [c])
有什么简单的方法可以做到这一点?
这基本上mapM
是StateT a IO
:
mapAccumLM f a xs = runStateT (mapM (StateT . f) xs) a
以非常相似的方式mapAccumL
:
mapAccumLM :: Monad m => (a -> b -> m(a, c)) -> a -> [b] -> m(a, [c])
mapAccumLM _ a [] = return (a, [])
mapAccumLM f a (x:xs) = do
(a', c) <- f a x
(a'', cs) <- mapAccumLM f a' xs
return (a'', c:cs)