Lambda和Proc的名称

4
有没有理由称lambda为lambda,而称proc为proc?据我所知,它们都是匿名函数……这就是与Haskell中的Lambda相似之处。它们不像来自Haskell的Lambda一样只接受一个参数。
为什么一个被称为Lambda,而两个都可以被等同地称为Lambda?为什么有人用“proc”命名其中一个,“lambda”命名第二个? ps. 它们都在一个类Proc中。有一个方法lambda?,用于显示它是否是lambda

1
我在一次面试中被问到了同样类型的问题,但我无法回答。今天我将从这里学习它。感谢你在这里提出它。 :) +1 - Arup Rakshit
@TonyHopkinson 不,不是这样的... 我认为,至少你提到的那个不是。 - Arup Rakshit
1
这是 https://dev59.com/lnI-5IYBdhLWcg3wqqTh 的副本。 - lipanski
@lipanski 不是重复的问题。我不是在问lambdaproc(->和'Proc.new')之间的区别。我在问为什么他们称之为lambda-lambda和proc-proc。 - Darek Nędza
@TonyHopkinson 请看上面的评论。 - Darek Nędza
显示剩余3条评论
2个回答

3
在Ruby中,lambda是一种特殊的Proc对象,其行为类似于方法。特别地,它会尊重参数个数:如果你给它错误的参数个数,它会报错。
请参见此答案(与无关问题相关)以了解它们之间差异的丰富例子: 为什么Hash#select和Hash#reject向一元块传递键? 回复评论:lamba和proc都生成Proc对象。唯一的区别是当涉及参数个数时上述行为不同,并且关于return语句会发生什么(请参见问题评论中的相关链接)。
至于为什么它们被命名为这样,我认为这就是Matz的选择:这是最自然的选择。他在一次采访中定义了他对此的理解。
每个人都有自己的背景。有些人可能来自Python,另一些人可能来自Perl,他们可能会对语言的不同方面感到惊讶。然后他们走到我面前说:“我对这种语言特性感到惊讶,所以Ruby违反了最少惊讶原则。”等等。最少惊讶原则不仅仅是为了你而存在。最少惊讶原则意味着最少我的惊讶原则。并且它意味着在你非常熟悉Ruby之后的最少惊讶原则。例如,我在设计Ruby之前是一名C++程序员。我专门使用C++编程了两三年。即使经过了两年的C++编程,它仍然让我感到惊讶。

http://en.wikipedia.org/wiki/Ruby_(programming_language)#Philosophy

在这种情况下,注意lambda函数的行为非常类似于方法,并且在这方面可以作为一个(匿名)函数。而proc则不行。将第一个命名为“lambda”似乎是一个自然的选择(至少对我来说是这样),而第二个则不行,因为在参数数量和返回语句方面存在差异。

1
它并没有解释为什么lambda是lambda,proc是proc等等。 - Darek Nędza
并不认为这句话证明了什么,除了“汉普蒂·韦尔德”式的理由:“当我使用一个词时,它的意思就是我选择的意思——既不多也不少。” - Donal Fellows
@DonalFellows:我已尽力添加一些关于此约定可能会感觉自然的内容。 - Denis de Bernardy
@CarySwoveland:哈哈!非常生动形象的表述。 :-) - Denis de Bernardy
2
丹尼斯,你是在说Lambda就像一个方法,既有需求又有性质吗? - Cary Swoveland
显示剩余2条评论

0
lambda 为什么叫 lambda,proc 为什么叫 proc?让我们看看在 ruby 1.8.7 中调用 proc 和 lambda 发生了什么:
aa = lambda {|a| nil }
# => #<Proc:0xb7351850@(irb):6>
aa.call
# warning: multiple values for a block parameter (0 for 1)
# => nil 

aa = proc {|a| nil }
# => #<Proc:0xb73451cc@(irb):10> 
aa.call
# warning: multiple values for a block parameter (0 for 1)

正如我们所看到的,在 Ruby 中,proclambda 之间没有区别。我相信 proc 最先出现在 Ruby 中。因为它只是 Proc.new 的别名,用于创建 Proc 对象。随后,lambda 被添加到了 Ruby 中,因为 Lambda 是计算机编程领域中所谓的匿名函数,开发人员可以看到该函数类的语言中的知名名称。

让我们看看在 Ruby 1.9.1 中发生了什么:

aa = lambda {|a| nil }
# => #<Proc:0x8054340@(irb):1 (lambda)> 
aa.call
# ArgumentError: wrong number of arguments (0 for 1)
from (irb):2:in `call'
from (irb):2
from /home/malo/.rvm/rubies/ruby-1.9.1-p431/bin/irb:12:in `<main>'
aa = proc {|a| nil }
# => #<Proc:0x8319bf0@(irb):3> 
aa.call
# => nil 

正如我们所看到的,在ruby 1.9.2(我猜自从ruby 1.9)中,属性lambda被添加到Proc实例中,表示匿名函数不会接受错误的参数数量。因此,将0个参数传递给1个必需的参数会引发ArgumentError异常。而将0个参数传递给1个必需的参数的proc对象会静默地丢弃不必要的参数。

正如您所知,在ruby 1.9.1中添加了->作为无参数lambda运算符的别名:

 aa = -> { nil }
 # => #<Proc:0x8056ffc@(irb):1 (lambda)> 
 aa = -> {|a| nil }
 # SyntaxError: (irb):2: syntax error, unexpected '|'
     aa = -> {|a| nil }
              ^

@Darek-Nedza 有任何有用的答案吗? - Малъ Скрылевъ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接