将Monad变压器与Identity monad一起使用而不仅仅使用变压器的“标准”版本有什么意义?
它更灵活吗?
答案 0 :(得分:31)
回到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
)中,Ross Paterson决定使用更简单的方法,只提供后者并使用Identity
作为基础monad
这导致减少了维护mtl
的实施工作,并消除了实现State
monad的两种不同方式的事实。然而,它确实使mtl
的内部更难以教授,因为你需要理解大门外的transformers
版本,并且不要将简化版本作为训练轮。
当旧的mtl
停用且monads-fd
成为mtl
2.0时,使用现有的transformers
此设计决定已被结转。
我个人喜欢至少在教学目的上使用单独的简单monad,但在辩论的另一边有更多的人。
答案 1 :(得分:11)
从文档:计算,没有理由使用Identity monad而不是简单地将函数应用于其参数的简单行为。 Identity monad的目的是它在monad变换器理论中的基本作用。应用于Identity monad的任何monad变换器都会产生该monad的非变换器版本。
据我了解,通过应用身份monad从monad变换器获取monad的非变换器版本正是身份monad所在的东西。仅使用非变压器monad没有任何优势,但有时你必须使用monad变压器,例如当您想要使用的功能需要它时。