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

它更灵活吗?

最佳答案

回到mtl 1.0,我们都

newtype State s a = State { runState :: s -> (a, s) }


newtype StateT s m a = StateT { runStateT :: s -> m (a, s) }

但是,这意味着任何必须为MonadState之类的实例实现实例的人都将花费大量的精力。

Ross Paterson在transformers(以及现已停用的monads-fdmonads-tf)中决定使用更简单的方法,即仅提供后者,然后将Identity用作基本单子(monad)。

这减少了维护mtl的实现工作,并消除了存在两种不同的方法来实现State monad的事实。但是,这确实使mtl的内部知识更难教授,因为您需要立即了解transformers的版本,而不必将简化的版本用作培训工具。

当旧的mtl退休并且monads-fd变成mtl 2.0时,使用现有的transformers保留了此设计决定。

我个人至少喜欢为教学目的使用单独的简单monad,但是辩论的另一端却有更多的人。

10-08 12:48