haskell - w ~ [a] 的 Control.Monad.Writer 的复杂度是多少?

标签 haskell time-complexity

假设 tell = Flip mappend 它应该是二次的,但这会使这个 Writer 实例变得毫无用处。如果确实如此,可以采取哪些措施来提高性能?

我正在考虑 Control.Monad.Free.Church 以及 Control.Monad.Co Density 中使用的技巧:应该可以重新关联 mapend 调用,就像 Co密度 重新关联 >>= 一样,但我还没有弄清楚具体是如何关联的。

最佳答案

总结一下:

  1. 是的,tell正在阅读 [a]二次复杂度为 Writer 。这可以通过使用 DList 来避免。 (它使用了我正在谈论的 Codensity 类似的技巧)或其他数据类型,其 mappend不是O(n^2) .

  2. 除此之外,Writer为每个 >>= 生成 thunk用于建立计算。这是一个问题,因为与第一种情况不同,它无法解决。解决方案是使用 State改为 monad。

关于haskell - w ~ [a] 的 Control.Monad.Writer 的复杂度是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39368619/

相关文章:

c - 递归的大O

将具有 10^6 位的十进制数转换为其二进制表示形式

haskell - 函数签名的别名

haskell - 是否有一个实用程序可以轻松地在 Haskell 中编写参数化测试?

haskell - 尝试实现 (>>=) 函数以创建自定义 monad 转换器时键入错误

performance - 查找两个节点之间所有路径的高效算法

haskell - 进行条件列表理解的惯用方法

Haskell 风格 : Pattern matching vs. 更直观的解决方案

algorithm - T(n) = 2T(n/2) + log n 的解

java - (c^k) 的大 O 表示法