Ruby和Lambda演算

时间:2013-08-12 21:58:13

标签: ruby lambda lambda-calculus

我试图用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}}?在第二个示例中,为什么1评估为x

3 个答案:

答案 0 :(得分: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,即把输出作为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!

答案 1 :(得分:1)

  

以上示例中->表示什么?

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

  

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

call方法是方法,它可以调用(或执行)lambda。 call方法的参数绑定到lambda的参数。

  

因此,在第一个示例中,值y传递给y,第二个示例1传递给x

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

  

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

1未评估x1是一个直接值,在Ruby中,立即值总是评估给自己。 1始终评估为1永远不会x或其他任何内容。

答案 2 :(得分: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。