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 ()
  然后, State和StateT都成为这个类的一个实例,它使用了这些可能性1 
  在您的示例实例中,如果我们知道MaybeT m的内部monad是(履行) MonadState s ,我们可以将整个外部monad视为MonadState s前提是我们将操作指向内部monad,以便它们适合外部monad,完成与lift 。 
  用普通的英语,这听起来像“如果MaybeT变换器转换(包装)在某种monad m ,而monad m是s类型s有状态( MonadState )monad,则结果类型也是该类型的有状态monad。 
  这实际上只是一个实例,因为State sa实际上是作为StateT s Identity a实施StateT s Identity a 。  请参阅来源获取实施细节。 
