首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby和Lambda微积分

Ruby和Lambda微积分
EN

Stack Overflow用户
提问于 2013-08-12 21:58:13
回答 3查看 677关注 0票数 0

我在试着用普鲁士和红宝石来理解蓝宝石。以下是一些代码:

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-12 22:53:31

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

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

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

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

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

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

在第二个例子中,为什么1是如何计算为x的?

1不评估x1是一个即时值,在Ruby中,即时值总是对自己进行评估。1将始终评估为1,而不是x或其他任何东西。

票数 1
EN

Stack Overflow用户

发布于 2013-08-12 22:54:01

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

代码语言:javascript
复制
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()获得结果

代码语言:javascript
复制
lmbd = -> greeting{ puts "#{greeting}, lambda-expression!" }

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

say_hello lmbd, "Aloha" # => Aloha, lambda-expression!
票数 2
EN

Stack Overflow用户

发布于 2015-11-05 15:45:54

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

代码语言:javascript
复制
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,函数式编程是基于这些替代原则的。

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

至于Lambda微积分https://github.com/mackorone/lambda/blob/master/intro.pdf

尽量保持简单,并显示步骤,而不是试图找出一个班轮在做什么。是的,它们很好,但是如果你看不懂,你就听不懂。

下面是我最近正在做的事情:

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18197345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档