gpt4 book ai didi

ruby - 我无法从理解计算中理解这个 lambda 演算

转载 作者:太空宇宙 更新时间:2023-11-03 16:00:36 27 4
gpt4 key购买 nike

在 Tom Stuart 的《Understanding Computation》一书中,有一章专门介绍通过 Procs/Lambdas 重建 FizzBu​​zz。他首先讨论了如何通过过程定义数字,并展示了一个“数字”可以由一个过程来表示,该过程针对它所代表的数字运行 x 次(即 1 是过程[x],2 是 proc[proc[x]],等等)。这就说得通了。然而,接下来他定义了一个 to_integer 方法:

def to_integer(proc)
proc[-> n { n + 1 }][0]
end

这把我的脑袋弄坏了。我无法理解这意味着什么。诚然,除了在使用 rails 时范围内的 lambda 之外,我并没有太多地使用 procs。

我可以把它简化为

def to_integer(proc)
proc[Proc.new(n){ n + 1 }][0]
end

...但这就是我所能得到的。谁能以更容易理解的方式解释或简化这一点?这里发生了什么?我对 proc[x][0] 风格感到困惑,n 来自哪里。我只是很难理解这一点。

在书中,传递给这个方法的过程是这样的:

ZERO = -> p { -> x { x } }
ONE = -> p { -> x { p[x] } }
TWO = -> p { -> x { p[p[x]] } }

最佳答案

to_integer 中的代码使用 Ruby 的 [] 调用过程的简写来链接 2 个过程调用。

在 IRB 中手动浏览它很有帮助。让我们从定义零(lambda)开始:

ZERO = -> p { -> x { x } }
=> #<Proc:0x007ff86a147930@(irb):103 (lambda)>

你会在这里看到不同的数字,但重要的是 ZERO 是一个 lambda,它是一个过程。

让我们给 to_integer 中的匿名 lambda 命名,以明确那里发生了什么。使用“stabby lambda”语法:

INCR = -> n { n + 1 }
INCR[2]
=> 3
INCR[3]
=> 4

我们发送一个数字,它返回该数字加 1。

然后我们将 ZERO 传递给 to_integer,它通过调用 lambda ZERO 并发送 INCR 来开始:

ZERO[INCR]
=> #<Proc:0x007ff86a0decf0@(irb):103 (lambda)>

如您所见,这将返回另一个 lambda(在 ZERO 中定义的,其中 p 设置为 INCR)。我们现在可以通过调用此 lambda 并发送 0 来开始滚动:

ZERO[INCR][0]
=> 0

关于ruby - 我无法从理解计算中理解这个 lambda 演算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26444061/

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