2013-04-11 38 views
17

使用带有Identity monad的Monad变压器而不仅仅是使用“标准”版本的变压器,有什么意义?带有标识monad的Monad变压器

它更灵活吗?

+0

你是什么意思的“标准”版本? – Adrian 2013-04-11 10:42:00

+0

你是什么意思,“变压器”的“标准”版本?通常,它是适用于身份单元的标准版本的变压器。 – leftaroundabout 2013-04-11 10:42:01

+0

我的意思是'国家的身份'和'国家的身份'两者在功能上是一样的,对吗? – 2013-04-11 10:43:35

回答

30

早在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)罗斯帕特森决定使用的仅提供后者,并使用Identity作为碱单子的简单的方法。

这导致维护mtl的实施工作量减少,并且消除了实现State monad有两种不同方式的事实。然而,它确实使得mtl的内部难以教授,因为您需要了解transformers版本,并且不要将简化版本作为训练轮。

当旧的mtl退役并且monads-fd变成mtl 2.0时,使用现有的transformers继续进行此设计决定。

我个人很喜欢为了教学目的而分开单纯的monad,至少在辩论的另一边有更多的人。

+5

我完全同意教学目的。也许我们应该建立一个包含原始简单版本的monads-teach包。 – 2013-04-11 15:37:40

11

从文档:在计算上,没有理由使用Identity monad,而不是简单地将函数应用于其参数。身份monad的目的是它在monad变换器理论中的基础性作用。应用于Identity monad的任何monad变换器都会生成该monad的非变换版本。

据我所知,通过应用身份monad从monad变压器获得monad的非变压器版本正是身份monad的存在。与仅使用非变压器单体相比,没有优点,但有时您必须使用单体变压器,例如,当你想使用的功能需要它。

相关问题