Haskell CPS 编程风格问题

标签 haskell continuations

这是一个使用 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'会怎样,两者之间有什么区别?

最佳答案

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

如果我们假设 mul 定义为 mul x y k = k $ x*y,则这不会产生实际差异,因为 y始终为 0。但是达到该结果的实际方法是不同的(除非编译器可能进行优化)。

关于Haskell CPS 编程风格问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3209026/

相关文章:

scala - Kiselyov zipper 的惯用 Scala 翻译?

haskell - StateT 超过 Cont。为什么我的状态没有被重置?

smalltalk - 使用 Seaside continuations

parsing - 可逆状态单子(monad)(和解析器)

haskell - 这种自由(更自由?)单子(monad)的构造有效吗?

haskell - Haskell 中的可选参数

f# - F# 中的复杂延续

haskell - 对于高性能应用服务器,我应该选择Yesod的Warp和snap-server中的哪一个?

haskell - 为什么不能推断类型类约束并变得模棱两可?

c# - 直接返回调用者的调用者并在下次调用时恢复状态