错误日志 monad 的高效实现
Efficient implementation of an error log monad
我需要一个 monad,它将在计算过程中报告错误数据类型(不是字符串)。我探索了几种不同的实现方式:
- 一个
State [Error] a
monad,其中错误添加了 cons (:
),最后我在错误列表上调用 reverse
以获取实际顺序。
- 一个
Writer (Endo [Error]) a
monad,我可以在其中使用 Endo (e :)
添加错误。不过,我担心身份函数的所有无用串联。如果我从不添加任何错误,那么我的 Endo
仍将是一个由许多串联的 id . id
组合组成的大型数据结构。
- A
Reader (MVector s Error) (ST s a)
monad,在添加新错误时我会在其中增加错误向量。 vector 包中没有预定义的“推送”功能,因此我必须自己编写。另外,它需要我在我的一些计算中添加一个 ST
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 来自结果类型中的纯代码的日志记录数据可能更有意义。
我需要一个 monad,它将在计算过程中报告错误数据类型(不是字符串)。我探索了几种不同的实现方式:
- 一个
State [Error] a
monad,其中错误添加了 cons (:
),最后我在错误列表上调用reverse
以获取实际顺序。 - 一个
Writer (Endo [Error]) a
monad,我可以在其中使用Endo (e :)
添加错误。不过,我担心身份函数的所有无用串联。如果我从不添加任何错误,那么我的Endo
仍将是一个由许多串联的id . id
组合组成的大型数据结构。 - A
Reader (MVector s Error) (ST s a)
monad,在添加新错误时我会在其中增加错误向量。 vector 包中没有预定义的“推送”功能,因此我必须自己编写。另外,它需要我在我的一些计算中添加一个ST
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 myST
code than for my pure code?
对于 ST
monad 中的内容,您可以使用如上所述的 monad 转换器。对于纯代码,事情比较棘手:您将不得不将纯代码重写为 monadic,或者至少 applicative。此时它不再是纯粹的,因为日志记录是一个副作用。很难提供进一步的建议,因为我不知道你想要达到什么目的; return 来自结果类型中的纯代码的日志记录数据可能更有意义。