gpt4 book ai didi

haskell - 难以通过 UTF8Builder 为 RIO.Logger 编写日志消息

转载 作者:行者123 更新时间:2023-12-04 15:27:51 26 4
gpt4 key购买 nike

我正在使用 RIO monad 和 RIO 库,并且想添加日志记录。 RIO 日志函数,如 logInfo,将 Utf8Builder 作为参数,它是 ByteString 构建器的包装器。我想在我的代码中有效地插入日志语句。但是,我不确定如何将简单的 TextStringByteString 值转换为适当的 Builder。

这不是类型检查:

logInfo $ "Identifier: " <> UUID.toByteString myId

其中 myId 是一个 UUID 值。类型检查器错误是

    • Couldn't match expected type ‘Utf8Builder’
with actual type ‘bytestring-0.10.10.0:Data.ByteString.Lazy.Internal.ByteString’

我尝试将 UUID 转换为 Text,尝试使用 encodeUtf8Builder,然后将生成的 Builder 包装在 Utf8Builder,但无济于事。

我的直觉告诉我,日志记录应该很简单,不需要大量转换;所以我可能错过了明显的路线。如何使用 RIO 记录器简单地记录值?

最佳答案

您想要的是UUIDDisplay 实例,这将允许您与Utf8Builder 高效结合并轻松地在您的日志中使用它.

instance Display UUID.UUID where
display = displayBytesUtf8 . UUID.toASCIIBytes

displayBytesUtf8 可以使用的唯一原因是因为您知道内容是 ascii。换句话说,您有责任在创建 Display 实例时生成正确编码的 utf8 字节。

之后你可以像这样在你的日志中使用它:

logInfo $ "Identifier: " <> display myId

创建 Display 实例严格来说不是必需的,如果您不想创建孤立实例或包装器新类型,您可以只使用辅助函数。这样就可以了:

displayUUID :: UUID.UUID -> Utf8Builder
displayUUID = displayBytesUtf8 . UUID.toASCIIBytes

我之所以提到 Display 是因为它是 RIO 中使用自定义类型进行日志记录的惯用方法。

关于haskell - 难以通过 UTF8Builder 为 RIO.Logger 编写日志消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61902241/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com