Этот раздел 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
- это MonadTrans
и m
это 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
, или я ошибаюсь?
Большое спасибо:)