将Monad转换器与Identity monad一起使用而不是只使用转换器的“标准”版本有什么意义?
它更灵活吗?
发布于 2013-04-11 20:56:25
在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
作为基单体。
这减少了维护mtl
的实现工作,并消除了有两种不同的方法来实现State
monad的事实。然而,这确实使mtl
的内部结构变得更难教授,因为您需要一开始就理解transformers
版本,而不是获得简化版本作为培训轮。
当旧的mtl
退役,monads-fd
成为mtl
2.0时,使用现有的transformers
,这个设计决策被延续了下来。
就我个人而言,至少出于教学目的,我喜欢使用单独的简单monads,但辩论的另一边的人要多得多。
https://stackoverflow.com/questions/15946633
复制相似问题