【发布时间】:2019-07-14 06:01:56
【问题描述】:
像(Monad m) => (s -> a -> m (s, b)) 这样的函数根据之前的状态和当前值产生一个新的状态和一个新的值是非常频繁的。
我们可以使用不同的方法来实现对a 列表的遍历,以在给定函数f :: s -> a -> m (s, b) 的情况下生成m [b]
- 使用
Control.Monad.foldM,但代码不是特别好 - 使用
traverse和StateT (WriterT m)monad,这样会更好一些
是否可以很好地利用现有的库来分解具有f 的“输出行为”的“状态定义的行为”,并在几个组合器中获得所需的遍历?
【问题讨论】:
-
将
m (s, [b])用作结果类型吗?这更容易获得。 -
我确实可以
fst <$>如果可能的话我想避免但请分享你的想法
标签: haskell functional-programming monads monad-transformers state-monad