1

我正在寻找一种在 IO monad 中使用 mapAccumL 的方法 - 类似于 mapM 的类似物,即具有这种类型签名:

mapAccumLM :: (Monad m) => (a -> b -> m(a, c)) -> a -> [b] -> m(a, [c])

有什么简单的方法可以做到这一点?

4

2 回答 2

6

这基本上mapMStateT a IO

mapAccumLM f a xs = runStateT (mapM (StateT . f) xs) a
于 2013-08-15T16:23:04.797 回答
2

以非常相似的方式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)
于 2013-08-15T16:10:22.187 回答