Monad变形金刚电梯

我只是在真实世界的Haskell中寻找monad变形金刚。 这本书说,为了制造一个monad变压器,你需要把它变成MonadTrans类型的一个实例。

所以本书定义了一台新的变压器,即MaybeT ma变压器。

他们为这个新变换器定义了monadTrans类型类:

instance MonadTrans MaybeT where
  lift m = MaybeT (Just `liftM` m)

然后他们为这个变压器创建了一个MonadState的实例:

instance (MonadState s m) => MonadState s (MaybeT m) where
  get = lift get
  put k = lift (put k)

从我的理解中,lift函数正在将底层monad包装到正确的构造函数中。 但是,我没有获得或放入MonadState类型的实现,我希望在理解电梯实际在这里做什么的帮助。 我也听说在mtl包中,由于类型类是如何定义的,你可以有一堆带有WriterT,StateT等的monad变换器,但是你可以使用get,put,tell等函数,而不需要实际提升。 我想知道这是如何工作,我强烈怀疑它与这些类型的类,但我不知道?


但是你可以使用get,put,tell等函数,而不需要实际提升

这是因为这些函数实际上是在例如MonadState类型类中定义的,而不是State类型。

class Monad m => MonadState s m | m -> s where
    get :: m s
    put :: s -> m ()

然后, StateStateT都成为这个类的一个实例,它使用了这些可能性1

在您的示例实例中,如果我们知道MaybeT m的内部monad是(履行) MonadState s ,我们可以将整个外部monad视为MonadState s前提是我们将操作指向内部monad,以便它们适合外部monad,完成与lift

用普通的英语,这听起来像“如果MaybeT变换器转换(包装)在某种monad m ,而monad ms类型s有状态( MonadState )monad,则结果类型也是该类型的有状态monad。


这实际上只是一个实例,因为State sa实际上是作为StateT s Identity a实施StateT s Identity a 。 请参阅来源获取实施细节。

链接地址: http://www.djcxy.com/p/77371.html

上一篇: Monad Transformers lift

下一篇: How to apply a custom Monad Transformer