我只是在研究现实世界 Haskell 中的 monad 转换器。书上说,要使某个东西成为 monad 转换器,您需要使其成为 MonadTrans 类型类的实例。
于是书中定义了一个新的Transformer,即MaybeT m a
transformer。
他们为这个新的转换器定义了 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 类型类中得到 get 或 put 的实现,我希望能帮助我理解 lift 在这里实际做了什么。我还听说在 mtl 包中,由于类型类的定义方式,您可以拥有一堆带有 WriterT、StateT 等的 monad 转换器,但您可以使用 get、put、tell 等函数而无需实际进行任何提升。我想知道这是如何工作的,我强烈怀疑它与这些类型类有关,但我不确定?