我的 Haskell web 应用程序以特定的日志记录配置开始。 Web 服务器启动后,日志配置将无法更改。这是日志记录配置控制的内容:
编写日志函数的简单方法是检查,对于每个日志语句,日志配置以确定 (a) 是否输出日志,(b) 使用哪种格式 -文本 vs json,以及 (c) 是否更新聚合指标
不知何故,这对我来说似乎效率很低。
是否有可能有效执行以下操作:
MonadLogger
的一个实例)中,这样编译器仍然能够执行它本来会执行的任何优化。最佳答案
当然。比较以下两个函数:
convertData :: Loggable a => Bool -> a -> ByteString
convertData b x = case b of
False -> viaString x
True -> viaJSON x
convertCode :: Loggable a => Bool -> a -> ByteString
convertCode b = case b of
False -> \x -> viaString x
True -> \x -> viaJSON x
在 GHC 中,如果您编写 convertData False
,那么它会在每次调用时检查并重新检查此 Bool
;而如果您编写 convertCode False
,则会检查一次 Bool
(并返回一个已经“内部化”Bool
的函数)。
这也适用于您的其他要求。只需将您的日志记录函数编写为一个函数,该函数采用日志记录配置,立即执行其所有 case
语句和其他检查,然后在每个结果案例中返回一个接受剩余参数的专用日志记录函数。
(为什么命名为 convertData
和 convertCode
?因为它们是 convert
函数的两个版本;一个将其配置显式存储为关闭-通过数据,而另一个将其配置隐式存储在程序计数器中。)
https://stackoverflow.com/questions/71791219/