【发布时间】:2014-09-11 06:29:41
【问题描述】:
假设我想生成一个项目列表,同时跟踪某些状态。例如,生成[1..],同时跟踪到目前为止生成的项目,或者生成随机数列表,跟踪RNG状态。
似乎有两种方法可以做到这一点:
1) 生成状态单子列表[State s a],然后运行sequence 得到State s [a]。然后使用runState 获取[a]。
2) 以某种方式使用 Monad 转换器。
monad 转换器方式的一个很好的例子是什么?哪个更惯用?各有什么优缺点?
【问题讨论】:
-
monad 转换器只是一种类型,它接受一些其他 monad 作为参数,并在原始 monad 中添加一些其他 monadic 效果。你永远不需要触摸变压器来做你想做的事。如果您需要跟踪状态,请使用
State;使用 monad 转换器并不意味着您必须或不能使用State。已经有一个包正好使用State来封装纯粹生成随机数的概念。 -
这正是管道和导管的用途。
标签: haskell monads monad-transformers state-monad