我已经问过这个问题 here ,但我想我也会尝试一下。
如何将 MonadLogger
添加到这个免费的 monad 转换器堆栈中?
newtype Craft a = Craft { unCraft :: ReaderT CraftEnv (FreeT CraftDSL IO) a }
deriving ( Functor, Monad, MonadIO, Applicative
, MonadReader CraftEnv, MonadFree CraftDSL, MonadThrow)
我能够毫无问题地添加 MonadThrow
;我希望添加 MonadLogger
也同样容易。
我尝试添加它,但收到此错误:
No instance for (MonadLogger (FreeT CraftDSL IO))
arising from the 'deriving' clause of a data type declaration
如果我定义一个实例:
instance MonadLogger (FreeT CraftDSL IO) where
monadLoggerLog a b c d = Trans.lift $ monadLoggerLog a b c d
我收到此错误:
Could not deduce (MonadLogger IO)
arising from a use of ‘monadLoggerLog’
Here是我正在编译的基本示例的链接。
最佳答案
将 LoggingT
添加到堆栈的基础中可以立即工作,但从来看
No instance for (MonadLogger (FreeT CraftDSL IO)) arising from the 'deriving' clause of a data type declaration
您想要在 DSL do block 中记录内容。为此,我们需要使 FreeT
成为 MonadLogger
的实例:
instance (MonadLogger m, Functor f) => MonadLogger (FreeT f m) where
monadLoggerLog loc source level msg = lift $ monadLoggerLog loc source level msg
由于 LoggingT
已经是 MonadLogger
的实例,因此 (MonadLogger m) => MonadLogger (FreeT f m)
约束适用于您的工艺
类型。
这段代码是为我编译的,但由于您没有提供最小的测试用例,我不确定它是否真的有效。
关于haskell - 如何将 MonadLogger 添加到我的免费 monad 转换器堆栈中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35029648/