如果Java用户选择Scala,C用户选择F用户,Ruby用户选择功能涅盘的地方是哪里?

如果Java用户选择Scala,C用户选择F用户,Ruby用户选择功能涅盘的地方是哪里?,ruby,scala,f#,functional-programming,paradigms,Ruby,Scala,F#,Functional Programming,Paradigms,我知道自从Scala在JVM上运行以来,很多Java用户都开始关注它,微软世界的很多人都在关注F#,但是Ruby作为一个自然的功能继承者有什么特点呢 从纯粹的FP意义上讲,Ruby并不缺少任何东西,相反,它有太多的东西,有些人可能会说。函数式语言迫使程序员不要太多地使用全局变量和其他习惯用法(尽管在函数式语言中可以使用全局变量)Ruby it self是一种函数式编程语言,所以我看不到使用Ruby的FP有什么特殊方言。Ruby it self是一种函数式编程语言,因此,我看不到使用ruby的FP

我知道自从Scala在JVM上运行以来,很多Java用户都开始关注它,微软世界的很多人都在关注F#,但是Ruby作为一个自然的功能继承者有什么特点呢


从纯粹的FP意义上讲,Ruby并不缺少任何东西,相反,它有太多的东西,有些人可能会说。函数式语言迫使程序员不要太多地使用全局变量和其他习惯用法(尽管在函数式语言中可以使用全局变量)

Ruby it self是一种函数式编程语言,所以我看不到使用Ruby的FP有什么特殊方言。

Ruby it self是一种函数式编程语言,因此,我看不到使用ruby的FP有任何特殊的方言。

任何版本的Lisp都应该可以。

任何版本的Lisp都应该可以。

Java用户在JVM上使用一种语言,并且想要一种与运行时兼容的功能更强的语言,所以他们选择Scala

C#人们在CLR上使用一种语言,并且想要一种与运行时兼容的功能更强的语言,所以他们选择了F#


Ruby用户正在使用一种已经非常实用的语言,他们在许多底层运行时(JRuby、IronRuby、MRI、MacRuby、Rubinius等)上使用它。我不认为它有一个天然的功能继承者,甚至不需要一个。

Java用户在JVM上使用一种语言,并且想要一种与运行时兼容的功能更强的语言,所以他们选择Scala

C#人们在CLR上使用一种语言,并且想要一种与运行时兼容的功能更强的语言,所以他们选择了F#


Ruby用户正在使用一种已经非常实用的语言,他们在许多底层运行时(JRuby、IronRuby、MRI、MacRuby、Rubinius等)上使用它。我不认为它有一个天生的功能继承者,甚至不需要一个。

在hype级别,Haskell。

在hype级别,Haskell。

Ruby没有Lisp那么功能,但它的功能足够让你以一种有趣的方式进行一些功能编程。(与尝试用C#之类的语言进行函数式编程不同)


此外,它实际上迫使您在某些语法中使用函数范式,例如大量使用块和屈服。(学习Ruby后我爱上了它)

Ruby的功能不如Lisp,但它的功能足以让您以一种有趣的方式进行一些函数式编程。(与尝试用C#之类的语言进行函数式编程不同)

此外,它实际上迫使您在某些语法中使用函数范式,例如大量使用块和屈服。(学习Ruby后我爱上了它)

对于“函数式编程”的含义有两种截然不同的定义。你可以用Ruby做一个,但不能做另一个

这两个定义是:

  • 具有一流功能的编程和
  • 用数学函数编程
您可以使用Ruby编写一种具有一流函数的程序。它支持一流的功能。事实上,它对它们有太多的支持:有
Proc.new
Proc
lambda
方法
取消绑定方法
,块,
#to_Proc
->(
)(可能还有一些我忘记的其他方法)

所有这些都有稍微不同的语法、稍微不同的行为和稍微不同的限制。例如:其中唯一一个在语法上足够轻量级,可以实际密集使用的是块。但是块有一些相当严格的限制:您只能将一个块传递给一个方法,块不是对象(在面向对象的语言中,“一切都是对象”是一个非常严格的限制),并且至少在Ruby 1.8中还有一些限制w.r.t参数

提到方法是另一件相当尴尬的事情。例如,我可以说
baz=foo.bar
来引用
foo
对象的
bar
方法。在Ruby中,
foo.bar
是一个方法调用,如果我想引用
foo
bar
方法,我必须说
baz=foo.method(:bar)
。如果我现在想调用这个方法,我不能只说
baz()
,我必须说
baz.call
baz[]
或(在Ruby 1.9中)
baz.(

因此,Ruby中的一流函数并不是真正的一流函数。它们比二等舱好得多,而且足够好™, 但它们并不完全是一流的

但是,一般来说,Ruby开发者不会仅仅为了一级函数而离开Ruby。Ruby的支持已经足够好了,您从另一种语言的更好支持中获得的任何优势通常都会被新语言的培训工作或您现在必须放弃的其他习惯所吞噬。比如说RubyGems或者紧密的Unix集成或者RubyonRails或者语法或者

然而,FP的第二个定义是Ruby的表面平坦。如果您想在Ruby中使用数学函数进行编程,您将陷入一个痛苦的世界。您不能使用绝大多数Ruby库,因为它们中的大多数都是有状态的、有效的、鼓励变异的或不纯净的。出于同样的原因,您不能使用标准库。不能使用核心库。您不能使用任何核心数据类型,因为它们都是可变的。你可以说“我不在乎它们是可变的,我只是不会变异它们并总是复制它们”,但问题是:其他人仍然可以变异它们。此外,由于它们是可变的,Ruby无法优化复制,垃圾收集器也没有针对这种工作负载进行调优

它就是不起作用

还有一些与功能性编程无关的特性,但是最实用的lan