【发布时间】:2016-10-01 11:52:47
【问题描述】:
我很困惑编译器没有抱怨下面的代码(代码编译):
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Main where
import Control.Monad.IO.Class (MonadIO)
import Control.Monad.Except (ExceptT)
main = undefined
newtype Foo e m a = Foo { unFoo :: ExceptT e m a }
deriving (Functor, Applicative, Monad, MonadIO)
如果我必须在某处添加 MonadIO m 作为约束,这对我来说会立即变得有意义,例如
deriving instance MonadIO m => MonadIO (Foo e m a)
确实,如果我尝试
deriving instance MonadIO (Foo e m a),
编译器抱怨。
我还注意到,当我在那里添加约束 MonadIO m 时,我只能使用 liftIO,稍后,无论我是否使用带有独立派生和约束的方法二,这又是有道理的。 MonadIO 实例在MonadIO m 的条件下。
只有我一个人,还是违反直觉?
是否与已弃用的 -XDatatypeContexts 扩展有关?
【问题讨论】:
标签: haskell io monad-transformers