这部分http://book.realworldhaskell.org/read/monad-transformers.html#id659032来自《Real World Haskell》一书,建议在编写新的 Monad Transformer 时,我们必须手动派生 、 等MonadState
的实例。MonadIO
但我尝试了以下并编译。为什么不在图书馆做呢?
假设我有MaybeT
单子变压器:
newtype MaybeT m a = MaybeT {
runMaybeT :: m (Maybe a)
}
instance Monad m => Monad (MaybeT m) where -- blah blah
instance MonadTrans MaybeT where
lift = MaybeT . (liftM Just)
那么一旦我们知道这t
是 aMonadTrans
并且m
是 a Monad
,为什么不能像这样自动导出其他所有内容?
instance (MonadTrans t, Monad (t m), MonadIO m) => MonadIO (t m) where
liftIO = lift . liftIO
instance (MonadTrans t, Monad (t m), MonadState s m) => MonadState s (t m) where
get = lift get
put = lift . put
作者的意思是我们必须为每个新的手动执行此操作,MonadTrans
否则我误解了他的意思?
非常感谢你 :)