在 Tom Stuart 的《理解计算》一书中,有一章专门讨论通过 Procs/Lambdas 重建 FizzBuzz。他首先讨论了如何通过过程定义数字,并展示了一个“数字”可以由一个过程来表示,该过程对于它所代表的数字运行 x
次(即 1 是 proc) [x], 2 是 proc[proc[x]] 等)。这就说得通了。然而,接下来他定义了一个 to_integer
方法,如下所示:
def to_integer(proc)
proc[-> n { n + 1 }][0]
end
这已经伤透我的脑筋了。我无法理解这意味着什么。诚然,除了在使用 Rails 时在范围内使用 lambda 之外,我并没有过多地使用 proc。
我可以将其简化为
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 中手动浏览它会很有帮助。让我们从定义 ZERO(a 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 中定义的 lambda,其中 p 设置为 INCR)。现在,我们可以通过调用此 lambda 并发送 0 来开始工作:
ZERO[INCR][0]
=> 0
关于ruby - 我无法理解理解计算中的 lambda 演算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26444061/