haskell - ghci 使用什么优化技术来加速递归映射?

标签 haskell optimization expression

假设我有以下功能:

minc = map (+1)
natural = 1:minc natural

它似乎是这样展开的:
1:minc(1:minc(1:minc(1:minc(1:minc(1:minc(1:minc(1:minc(1:minc(1:minc...
1:2:minc(minc(1:minc(1:minc(1:minc(1:minc(1:minc(1:minc(1:minc(1:minc...
1:2:minc(2:minc(2:minc(2:minc(2:minc(2:minc(2:minc(2:minc(2:minc(minc...
1:2:3:minc(3:minc(3:minc(3:minc(3:minc(3:minc(3:minc(3:minc(minc(minc...
...                                                                

虽然懒惰评估,但要建立每个新号码n列表中有展开表达式n给我们的时间 O(N^2)复杂。但是到了执行时间,我可以看到真正的复杂性仍然是线性的!

在这种情况下 Haskell 使用哪种优化以及它如何展开这个表达式?

最佳答案

自然数列表在每个递归步骤之间共享。该图是这样评估的。

1:map (+1) _
 ^         |
 `---------'

1: (2 : map (+1) _)
      ^          |
      `----------'

1: (2 : (3 : map (+1) _)
           ^          |
           `----------'

这种共享意味着代码使用 O(n) 时间而不是预期的 O(N^2)。

关于haskell - ghci 使用什么优化技术来加速递归映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28913860/

相关文章:

jquery - 使用捆绑配置时如何在 Razor 中正确渲染图像路径

python - 'max area of islands' 算法的 3D 实现期间核心转储

asp.net - <#=#>是什么意思

scala - Kotlin:花括号围绕几个表达式(或语句)

xml - 在 Haskell 中,如何从 XML 文档中提取字符串?

haskell - Haskell 中的定点组合器

Java 编译器不会自动优化字符串连接?

haskell - Haskell 列表推导式中的 OR 条件

haskell - 在给定路径中查找给定字符串

java - 类名是表达式吗?