错误日志 monad 的高效实现

Efficient implementation of an error log monad

我需要一个 monad,它将在计算过程中报告错误数据类型(不是字符串)。我探索了几种不同的实现方式:

在命令式语言中,我会使用一个向量并调用“push”方法或等效方法,这会给我分摊 O(1) 追加,并且结果列表将按正确顺序排列。

对于此任务,Haskell monad 的最有效实现是什么(相对于命令式语言的效率)?

我的一些代码在 ST monad 中,我的一些代码是纯代码。我可以为这些不同的用例使用不同的 monad。我的 ST 代码是否应该使用与纯代码不同的东西?

您的日志记录 monad 应该基于 StateT Seq。如果使用 StateT,您将拥有一个 monad 转换器,它可以将您的日志记录功能覆盖在任何其他 monad 上。

Some of my code is in an ST monad and some of my code is pure. I can use different monads for these different use cases. Should I use something different for my ST code than for my pure code?

对于 ST monad 中的内容,您可以使用如上所述的 monad 转换器。对于纯代码,事情比较棘手:您将不得不将纯代码重写为 monadic,或者至少 applicative。此时它不再是纯粹的,因为日志记录是一个副作用。很难提供进一步的建议,因为我不知道你想要达到什么目的; return 来自结果类型中的纯代码的日志记录数据可能更有意义。