ruby - 我无法理解理解计算中的 lambda 演算

标签 ruby lambda

在 Tom Stuart 的《理解计算》一书中,有一章专门讨论通过 Procs/Lambdas 重建 FizzBu​​zz。他首先讨论了如何通过过程定义数字,并展示了一个“数字”可以由一个过程来表示,该过程对于它所代表的数字运行 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/

相关文章:

c# - lambda 函数是否比委托(delegate)/匿名函数更快?

c++ - 在嵌套的 lambda 中应用 function_traits 时编译失败

c++ - Lambda 函数作为构造函数中 std::function 的默认参数

ruby-on-rails - 模拟 rspec 中的方法链

ruby - 使用 ffmpeg、ffprobe 或 rvideo 在 ruby​​ 脚本中获取视频元数据

ruby - 如何使用 Ruby Net::SSH.start 传输多个文件?

ruby-on-rails - Ruby 中的绝对符号是什么意思?

ruby - 如何让 Textile 从纯 URL 中创建链接?

c# - IQueryable 上的动态 "WHERE IN"(linq to SQL)

c - 如何为 C 函数创建闭包