gpt4 book ai didi

haskell - 错误日志 monad 的高效实现

转载 作者:行者123 更新时间:2023-12-02 10:43:58 25 4
gpt4 key购买 nike

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

  • A State [Error] a monad,其中使用 cons (:) 添加错误,最后我在该单子(monad)上调用 reverse错误列表以获取实际订单。
  • 一个 Writer (Endo [Error]) 一个 monad,我可以在其中使用 Endo (e :) 添加错误。不过,我担心身份函数的所有无用串联。如果我从不添加任何错误,那么我的 Endo 仍然是一个由许多串联的 id 组成的大型数据结构。 id 组合。
  • A Reader (MVector s Error) (ST s a) monad,在添加新错误时我会在其中增长错误向量。矢量包中没有预定义的“推送”函数,因此我必须编写自己的函数。此外,它还需要我在一些计算中添加一个 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 转换器。对于纯代码,事情更加棘手:您必须将纯代码重写为单子(monad),或者至少 applicative 。此时它不再是纯粹的,因为日志记录是一个副作用。很难进一步提供建议,因为我不知道你想要实现什么目标;从结果类型内的纯代码返回日志数据可能更有意义。

关于haskell - 错误日志 monad 的高效实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54315023/

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