【发布时间】:2016-06-25 09:40:31
【问题描述】:
- fix-point combinators 是引入递归的非常有用的工具。
- Continuation-Passing style 是一种 lambda 演算风格,其中函数永远不会返回。相反,您将程序的其余部分作为 lambda 参数传递给您的函数并继续执行它们。它使您可以更好地控制执行流程并更轻松地定义各种流程更改结构(循环、协程等......)
但是,我想知道您是否可以用另一种方式表达?我见过的所有 CPS 风格的语言都有一个明确的 FIX 构造来定义递归。
- 是不是因为在没有
FIX的情况下无法在普通 CPS 中定义定点组合器(或类似的)?如果有,你知道这件事的证明吗? - 还是仅仅是因为打字问题?
- 或者有可能,但由于某种原因不切实际?
- 或者我根本没有找到现成的解决方案...?
我希望类似 Y-combinator 的 CPS 函数 CPSY 可以这样工作:
如果我定义一个 Y-ready CPS 函数,比如:
function Yready(this, return) =
return (lambda <args> . <body using 'this' as recursion>);
然后我会将它放入CPSY 以生成一个递归到自身的函数:
function CPSY(F, return) = ?????
CPSY(Yready,
lambda rec . <body where 'rec' names 'lambda <args>' from above, but with the loop closed>
)
CPSY 应该是一个简单的延续传递风格的函数,它本身不依赖于任何递归。 Y-combinator 可以在没有内置递归的普通 lambda 演算中以这种方式定义。它能否以某种形式存在于 CPS 中?
再次澄清:我正在寻找一个类似组合器的函数CPSY:
- 将启用 CPS 函数的递归
- 它的定义不依赖递归
- 它的定义以连续传递样式给出(
CPSY的正文中的任何地方都没有返回 lambda)
【问题讨论】:
-
"... IOW,不以任何形式使用
letrec,仅使用let(在Scheme 术语中)。"我相信这就是你的意思。有趣的问题...
标签: functional-programming scheme continuation-passing fixpoint-combinators