- 定点组合器是引入递归的非常有用的工具。
- Continuation-Passing 风格是一种 lambda 演算风格,其中函数永远不会返回。相反,您将程序的其余部分作为 lambda 参数传递给您的函数并继续执行它们。它使您可以更好地控制执行流程并更轻松地定义各种流程更改结构(循环、协程等)
但是,我想知道您是否可以用另一种方式表达?我见过的所有 CPS 风格的语言都有一个明确的FIX
结构来定义递归。
- 是因为不可能在普通 CPS 中定义定点组合器(或类似的),没有
FIX
?如果是这样,你知道这件事的证据吗? - 或者仅仅是因为打字问题?
- 或者也许这是可能的,但由于某种原因不切实际?
- 或者我根本没有找到一个解决方案......?
我希望类似 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 函数的递归
- 它的定义不依赖递归
- 它的定义以连续传递样式给出(在 的主体内任何地方都没有返回 lambda
CPSY
)