小编Blu*_*ers的帖子

为所有 MonadTrans 实例提供类型类实例

我定义了自己的 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 定义一个通用实例,而不是让我为每个新的 …

haskell typeclass monad-transformers

7
推荐指数
1
解决办法
884
查看次数

标签 统计

haskell ×1

monad-transformers ×1

typeclass ×1