我定义了自己的 monad 转换器:
data Config = Config { ... }
data State = State { ... }
newtype FooT m a = FooT {
runFoo :: ReaderT Config (StateT State m) a
} deriving (Functor, Monad, MonadReader Config, MonadState State)
Run Code Online (Sandbox Code Playgroud)
我已经MonadTrans为它定义了一个实例。
instance MonadTrans FooT where
lift = FooT . lift . lift
Run Code Online (Sandbox Code Playgroud)
现在,我有各种单子,我不能仅仅由编译器为我派生这些单子。我就拿MonadIO这个例子来说吧。所以我将我的MonadIO实例定义为
instance MonadIO m => MonadIO (FooT m) where
liftIO = lift . liftIO
Run Code Online (Sandbox Code Playgroud)
然而,我发现我为每个 Monad 做了很多提升。为什么每个 Monad 类型类(即 MonadIO、MonadCatchIO、MonadFoo)的作者不能根据 MonadTrans 定义一个通用实例,而不是让我为每个新的 …