0

我正在尝试使用 procs 和 ruby​​ 来理解 lambda 演算。这是一些代码:

puts -> x { -> y {x.call(y) } }
# => #<Proc:0x2a3beb0@C:/first-ruby.rb:1 (lambda)>

puts -> x { x + 2}.call(1)
# => 3

->在上面的例子中意味着什么?方法是否call将值传递给调用者,所以在第一个示例中,值y被传递给y,而在第二个示例中,1被传递给x?在第二个示例中,为什么1评估为x

4

3 回答 3

2

这是纯 lambda 表达式的快捷方式:

lmbd = -> arg{ something to do with arg } # With ->{} notation

lmbd = lambda { |arg| something to do with arg } # Standard notation

在您的第一个示例中,您使用 Proc(lambda) 对象调用 puts 方法,这就是您#<Proc:0x2a3beb0@C:/first-ruby.rb:1 (lambda)>在输出中看到的原因。

在第二个示例中,您使用 lmbd.call(1) 方法调用 puts,即 puts 输出 lambda 计算的结果。

所以,如果你有lmbd变量,它是 lambda 对象,你可以像任何参数一样传递它,然后通过调用得到它的结果lmbd.call()

lmbd = -> greeting{ puts "#{greeting}, lambda-expression!" }

def say_hello l, text
    l.call(text)
end

say_hello lmbd, "Aloha" # => Aloha, lambda-expression!
于 2013-08-12T22:54:01.617 回答
1

->在上面的例子中意味着什么?

->是 lambda 的文字语法的一部分,就像,说,'是字符串的文字语法的一部分。

.call方法是否只是将值传递给调用者,

call方法就是调用(或执行)lambda 的方法。方法的参数call绑定到 lambda 的参数。

所以在第一个例子中,值y被传递给y,在第二个例子1中被传递给x

不,在第一个示例中,y传递给外部 lambda 并绑定到其x参数。在第二个示例中,1传递给 lambda 并绑定到它的x参数。

在第二个示例中,为什么如何1评估x

1不评估为x. 1是一个立即数,在 Ruby 中,立即数总是对自己求值。1始终评估为,1从不评估x或其他任何内容。

于 2013-08-12T22:53:31.160 回答
0

让我们使用 Ruby lambda 定义一个函数。

def plus_two # no args here
  ->(x) {x + 2} # args go here
end

# assign a value
x = 1

# call it
plus_two.call(x)
# => 3

您的第一个示例有点复杂,但是使用这个想法,您应该能够提出功能方法。我正在研究 Scala 和函数式编程是基于这些替换原则。

尝试使用这些进行一些递归。这就像调用函数的函数 n 次。那么基本情况是什么?

至于 Lambda 演算https://github.com/mackorone/lambda/blob/master/intro.pdf

尽量保持简单并展示步骤,而不是试图弄清楚一个班轮在做什么。是的,它们很好,但如果你看不懂它,你就无法理解它。

这是我最近正在做的事情:

require 'date'

num = DateTime.now.to_time.utc.to_datetime.ajd - 2451545.0
@t = num / 36525.0

# the terms in reverse order form for the array
@l0_a = [1.0/-19880000.0,
         1.0/-152990.0,
         1.0/499310.0,
         0.0003032028,
         36000.76982779,
         280.4664567]

 # make an enumerator
 @l0_e = @l0_a.each

 # make a lambda to pass the enumerator to.
 def my_lambda
   ->(x) {x.reduce {|acc, el| acc * @t + el} % 360}
 end

 puts  my_lambda.call(@l0_e)

这是使用枚举器方法的太阳公式的平均经度,当然还有 lambda。

于 2015-11-05T15:45:54.690 回答