【问题标题】:Haskell CPS Programming Style ProblemHaskell CPS 编程风格问题
【发布时间】:2010-07-09 00:27:08
【问题描述】:

这是一个使用 CPS 样式将列表中的元素相乘的函数

mlist xx k = aux xx k
  where aux [] nk = nk 1
    aux (0:xs) nk = k 0
    aux (x:xs) nk = aux xs $ \v -> mul x v nk

如果我将表达式aux (0:xs) nk = k 0中的'k'改为'nk',这两者有什么区别?

【问题讨论】:

    标签: haskell continuations


    【解决方案1】:

    k 始终是传递给mlist 的原始延续,而对于列表 [1, 0],nk 在这种情况下将是\v -> mul 1 v k(来自aux 的第三种情况)。

    如果我们假设 mul 被定义为 mul x y k = k $ x*y,这并没有实际的区别,因为 y 将始终为 0。但得到该结果的实际方法是不同的(除非可能由编译器)。

    【讨论】:

    • IME,使用 k 而不是传递新的延续通常允许显着的编译器优化。我还没有看到使用“k”至少不如“nk”高效的案例,而且它通常更快。
    【解决方案2】:

    不同之处在于,原始定义“短路”尾调用应用程序传递的任何累积乘法,而更改后的表达式仅短路测试值 - 它保留了延续函数的累积“版本” .

    【讨论】:

      猜你喜欢
      • 2022-10-04
      • 1970-01-01
      • 2019-12-13
      • 2020-04-09
      • 2010-11-08
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多