haskell - 如何将 MonadLogger 添加到我的免费 monad 转换器堆栈中?

标签 haskell logging monad-transformers free-monad

我已经问过这个问题 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/

相关文章:

git - 在 git 中记录前 10 个

java - 如何获取从日期到日期的tomcat日志文件数据并将其作为文件显示在jsp中(JAVA)

haskell - 如何向此 monad 转换器添加列表或 List?

haskell - 单子(monad)转换器上下文中的单子(monad)

swift - Swift 中类似 Haskell 的模式?

haskell - 当输入值是Haskell中的Float类型而不是Integer类型时,如何创建错误消息

haskell - Xmonad 将窗口转移到另一个屏幕并通过一个键绑定(bind)聚焦它

docker - 为什么COPY指令在我的Docker构建中导致缓存未命中

Qt 5 Logging - 使用 QLoggingCategory 定义类别

haskell - Pipes-2.1.0 包中的最终确定