【发布时间】:2019-08-25 22:57:23
【问题描述】:
我有以下新类型声明。它包装了一个 Monad 堆栈转换器,堆叠了一些标准的 mtl monad,例如 Reader 和 except。
newtype TrxDbFileBased f a = TrxDbFileBased {
unTrxDbFileBased :: ExceptT TrxDbError (ReaderT TrxDbFileBasedEnv f) a
} deriving (
Functor
, Applicative
, Monad
, MonadError TrxDbError
, MonadReader TrxDbFileBasedEnv
, MonadIO
, MonadTrans
)
data TrxDbFileBasedEnv = TrxDbFileBasedEnv {
workingDirectory :: FilePath
} deriving (Show)
data TrxDbError = TrxDbErrorIO TrxDbFileBasedEnv IOException
| TrxDbErrorStr TrxDbFileBasedEnv String
deriving (Show)
我希望这个新类型成为 MonadTrans 的一个实例,但我收到以下错误。
• Can't make a derived instance of ‘MonadTrans TrxDbFileBased’
(even with cunning GeneralizedNewtypeDeriving):
cannot eta-reduce the representation type enough
• In the newtype declaration for ‘TrxDbFileBased’
|
31 | , MonadTrans
| ^^^^^^^^^^
我不明白为什么不能派生MonadTrans,因为基础类型是ExceptT,它是MonadTrans 的一个实例。
【问题讨论】:
标签: haskell monads monad-transformers