gpt4 book ai didi

functional-programming - 在Continuation Passing样式中定义定点组合器

转载 作者:行者123 更新时间:2023-12-04 03:57:13 25 4
gpt4 key购买 nike

  • fix-point combinators是引入递归的非常有用的工具。
  • Continuation-Passing style是lambda演算的一种样式,函数从不返回。相反,您将程序的其余部分作为lambda参数传递给函数,然后继续执行它们。它使您可以更好地控制执行流程,并更轻松地定义各种更改流程的构造(循环,协程等)。

  • 但是,我想知道您是否可以互相表达?我见过的所有CPS风格的语言都有一个明确的 FIX构造来定义递归。
  • 是因为没有FIX不可能在普通CPS中定义定点组合器吗?如果是这样,您知道这种事情的证据吗?
  • 还是仅由于键入问题?
  • 也许有可能,但是由于某种原因不切实际?
  • 还是我根本没有找到解决方案……?

  • 我希望像Y组合器的CPS函数 CPSY可以这样工作:
    如果我定义了一个支持Y的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应该是一个简单的连续传递样式函数,而本身不依赖任何递归。可以在没有内置递归的情况下以纯lambda演算定义Y组合器。它也可以某种形式存在于CPS中吗?

    重申一下:我正在寻找类似组合器的函数 CPSY:
  • 将启用CPS函数的递归
  • 它的定义不依赖于递归
  • 以连续传递样式给出它的定义(在CPSY体内的任何地方都没有返回的lambda)
  • 最佳答案

    首先,让我们得出CPS-Y以便在Lambda演算中进行正序评估,然后将其转换为应用阶。

    Wikipedia page通过以下公式定义定点组合器Y:

    Y f = f (Y f)

    在CPS形式中,此等式看起来像这样:
    Y f k = Y f (λh. f h k)

    现在,考虑以下Y的非CPS正态定义:
    Y f = (λg. g g) (λg. f (g g))

    将其转换为CPS:
    Y f k = (λg. g g k) (λg.λk. g g (λh. f h k))

    现在,使用beta减少此定义几次,以检查它是否确实满足上述“CPS定点”条件:
    Y f k = (λg. g g k) (λg.λk. g g (λh. f h k))
    = (λg.λk. g g (λh. f h k)) (λg.λk. g g (λh. f h k)) k
    = (λg.λk. g g (λh. f h k)) (λg.λk. g g (λh. f h k)) (λh. f h k)
    = Y f (λh. f h k)

    瞧!

    现在,对于应用顺序评估,我们当然需要对此稍作更改。此处的推理与非CPS情况下的推理相同:我们需要“简化”递归 (g g k)调用,仅在下次调用时继续进行:
    Y f k = (λg. g g k) (λg.λk. f (λx.λk. g g (λF. F x k)) k)

    这是直接转换为 Racket :
    (define (Y f k)
    ((λ (g) (g g k))
    (λ (g k) (f (λ (x k) (g g (λ (F) (F x k)))) k))))

    我们可以检查它是否确实有效—例如,这是CPS中的递归三角数计算(为简单起见,算术运算除外):
    (Y (λ (sum k) (k (λ (n k) (if (< n 1)
    (k 0)
    (sum (- n 1) (λ (s) (k (+ s n))))))))
    (λ (sum) (sum 9 print)))
    ;=> 45

    我相信这可以回答问题。

    关于functional-programming - 在Continuation Passing样式中定义定点组合器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35918279/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com