蒙纳德变形金刚与身份monad

时间:2013-04-11 10:38:21

标签: haskell

将Monad变压器与Identity monad一起使用而不仅仅使用变压器的“标准”版本有什么意义?

它更灵活吗?

2 个答案:

答案 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-fdmonads-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变压器,例如当您想要使用的功能需要它时。

相关问题