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
。 请参阅来源获取实施细节。