回答
早在mtl
1.0,我们有两个
newtype State s a = State { runState :: s -> (a, s) }
和
newtype StateT s m a = StateT { runStateT :: s -> m (a, s) }
然而,这意味着任何人谁不得不实施情况的东西像MonadState
清盘重复劳动。
在transformers
(和现在停止活动monads-fd
和monads-tf
)罗斯帕特森决定使用的仅提供后者,并使用Identity
作为碱单子的简单的方法。
这导致维护mtl
的实施工作量减少,并且消除了实现State
monad有两种不同方式的事实。然而,它确实使得mtl
的内部难以教授,因为您需要了解transformers
版本,并且不要将简化版本作为训练轮。
当旧的mtl
退役并且monads-fd
变成mtl
2.0时,使用现有的transformers
继续进行此设计决定。
我个人很喜欢为了教学目的而分开单纯的monad,至少在辩论的另一边有更多的人。
我完全同意教学目的。也许我们应该建立一个包含原始简单版本的monads-teach包。 – 2013-04-11 15:37:40
从文档:在计算上,没有理由使用Identity monad,而不是简单地将函数应用于其参数。身份monad的目的是它在monad变换器理论中的基础性作用。应用于Identity monad的任何monad变换器都会生成该monad的非变换版本。
据我所知,通过应用身份monad从monad变压器获得monad的非变压器版本正是身份monad的存在。与仅使用非变压器单体相比,没有优点,但有时您必须使用单体变压器,例如,当你想使用的功能需要它。
- 1. monad在monad变压器上下文
- 2. monad变压器中的内部monad是否有`replicateM`函数?
- 3. 列表monad变压器
- 4. Monad堆栈渗透类与免费/操作Monad变压器?
- 5. 在monad变压器堆栈中的evalState
- 6. monad变压器的使用和示例?
- 7. 作为变压器摘要monad作文
- 8. 当monad变压器需要提升吗?
- 9. Monad变压器:IO和状态
- 10. IO和未来[选项] monad变压器
- 11. 要使用哪种Monad变压器?
- 12. 在Haskell中使用monad变压器RWST
- 13. 如何上传monad变压器类型?
- 14. 如何缩放monad变压器?
- 15. 避免与Monad变压器电梯
- 16. Monad变压器和电梯功能
- 17. 整理Monads - 将monad变压器的应用转换为新型monad
- 18. 是否有一个monad没有相应的monad变换器(IO除外)?
- 19. 在IO monad中使用monad
- 20. 添加一个monad到变压器堆栈的中间
- 21. 在快照中使用读卡器monad(或者,在快照中使用monad变压器)
- 22. 在变压器堆栈中展开STT monad?
- 23. 如何让ReaderT与另一个monad变压器一起工作?
- 24. 如何从main启动monad变压器堆栈?
- 25. 捕捉monad变换器中的异常
- 26. 有没有叫“semi-monad”或“counter-monad”的东西?
- 27. 为什么ListT monad变压器被认为是越野车 - 它打破了哪些monad法则?
- 28. 在monad变压器堆栈中使用weightedSample时,“没有MonadRandom的实例”
- 29. Markup monad如何与Html monad关联?
- 30. 全局变量和阅读器monad
你是什么意思的“标准”版本? – Adrian 2013-04-11 10:42:00
你是什么意思,“变压器”的“标准”版本?通常,它是适用于身份单元的标准版本的变压器。 – leftaroundabout 2013-04-11 10:42:01
我的意思是'国家的身份'和'国家的身份'两者在功能上是一样的,对吗? – 2013-04-11 10:43:35