如果Java人员去Scala,C#去F#,Ruby人们去哪里寻找功能性的必杀技?

Zub*_*air 36 ruby paradigms f# functional-programming scala

我知道很多Java人已经开始关注Scala,因为它在JVM上运行,而且微软世界的很多人都在关注F#,但是Ruby有什么作为自然的功能继承者呢?

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

Jör*_*tag 76

有2点非常不同的东西"函数编程"的意思的定义.你可以在Ruby中做一个,但你不能做另一个.

这两个定义是:

  • 使用一流的函数编程
  • 用数学函数编程

您可以使用Ruby中的一流函数进行编程.它支持一流的功能.事实上,它有太多对他们的支持:有Proc.new,proc,lambda,Method,UnboundMethod,块,#to_proc->()(可能有些人认为我忘了).

所有这些行为略有不同,语法略有不同,行为略有不同,限制略有不同.例如:其中唯一一个语法上足够轻巧,你可以密集地使用它的是块.但是块有一些相当严格的限制:你只能将一个块传递给一个方法,块不是对象(在面向对象的语言中,"一切都是一个对象"是一个非常严格的限制)并且至少在Ruby中1.8参数也有一些限制.

提到一种方法是另一件相当尴尬的事情.例如,在PythonECMAScript中,我只能说baz = foo.bar引用对象的bar方法foo.在Ruby中,foo.bar是一个方法调用,如果我想参考bar方法foo,我不得不说baz = foo.method(:bar).如果我现在想要调用该方法,我不能只说baz(),我必须说baz.callbaz[]或(在Ruby 1.9中)baz.().

所以,Ruby中的第一类函数并不是真正的一流.他们比二等奖好得多,而且他们足够好,但他们并不完全是一流的.

但一般来说,Rubyists不会将Ruby留给一流的函数.Ruby的支持非常好,以至于你可以从另一种语言的更好支持中获得的任何好处通常会被新语言的培训工作或者你现在必须放弃的其他习惯所吸引.比如,说RubyGems或紧密的Unix集成或Ruby on Rails或语法或......

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

它只是不起作用.

还有一些功能与函数式编程实际上没有任何关系,但大多数函数式语言往往都缺少Ruby.例如,模式匹配.Enumerator在Ruby 1.9中更积极地使用之前,懒惰也不容易实现.并且仍然有一些东西适用于严格的Enumerables或Arrays但不适用于惰性Enumerators,尽管实际上他们没有理由要求严格.

对于FP的这个定义,将Ruby留在后面是绝对有意义的.

是Ruby开发者已蜂拥到两个主要的语言,是二郎神Clojure的.这些都是Ruby相对较好的匹配,因为它们都是动态类型的,具有与Ruby类似的REPL文化,并且(这更像是Rails而不是Ruby的东西)在Web上也非常好.他们仍然是一个非常小而热情的社区,原始的语言创造者仍然活跃在社区中,强烈关注做新的,令人兴奋的和前卫的事物,所有这些都是Ruby社区也有的特征.

当有人在RubyConf 2006上展示1993年的原创视频" Erlang:The Movie "时,对Erlang的兴趣开始了.一些备受瞩目的Rails项目开始使用Erlang,例如PowerSetGitHub.对于Rubyists来说,Erlang也很容易掌握,因为它不像HaskellClean那样纯粹.演员的内心非常纯粹,但发送信息本身的行为当然是副作用.另一件让Erlang易于掌握的事情是,当你遵循Alan Kay对面向对象编程的定义时,Actors和Objects实际上是同一件事.

Clojure是Rubyist工具带的最新成员.它的受欢迎程度主要是因为Ruby社区终于热衷于JVM≠Java并接受JRuby这一事实,然后他们开始关注JVM上其他有趣的东西.而且,Clojure比其他函数语言(如Haskell和其他类似Scheme的 Lisps)更加实用,并且比CommonLisp更简单,更现代,因此它非常适合Rubyists.

关于Clojure的另一个很酷的事情是,因为Clojure和Ruby都在JVM上运行,所以你可以它们组合起来.

例如," 编程Clojure "(Stuart Halloway)的作者是(前?)Rubyist,作为Leiningen Clojure构建工具的作者Phil Hagelberg也是如此.

然而,Rubyists也在研究Scala(作为一种更实用的静态类型FP语言)和Haskell(作为更优雅的一种).然后有像ScubyHubris这样的项目,它们可以让你分别将Ruby与Scala和Haskell集成在一起.Twitter决定将他们的部分低级消息传递基础设施从MySQL迁移到Ruby,然后从Ruby迁移到Scala也是众所周知的.

F#似乎根本没有发挥任何作用,可能是由于对Ruby社区的微软所有事情的非理性恐惧.(其中,顺便说一句,似乎大多是没有根据的,因为F#的团队始终可用版本的单声道).

  • 这是一个惊人的反应 - 我很高兴看到有人接触到这样一种观点,即函数式编程不仅仅是闭包和一流函数之类的语言结构.每当我听到人们说"Ruby功能足够"时我就会有点畏缩 - 正如你的第二个项目所指出的那样,函数式编程更多的是关于风格和方法而不是特定的语言特性. (10认同)
  • 这取决于.术语"函数式编程"是为Lisp发明的,它非常不纯,有状态,有效,强制或任何你想称之为的东西.(除了Scheme和Clojure之外,这两个术语在发明时都不存在.)最广泛使用的Lisp是CommonLisp,根据"函数"的数学定义,它根本不起作用*.人们建议将第二类称为"价值导向编程"或"纯函数编程",以消除混淆.Martin Odersky(Scala的设计师)称他们为"包容性"和"独家" (2认同)

Mic*_*ene 15

Java人员正在JVM上使用一种语言,并且想要一个与其运行时兼容的功能更强大的语言,因此他们会转到Scala.

C#人员正在使用CLR上的一种语言,并且想要一个与其运行时兼容的功能更强大的语言,因此他们会转到F#.

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


Nem*_*vic 7

任何版本的Lisp应该没问题.

  • 感谢downvote,但问题是(我引用原文):"Ruby有什么作为自然功能的继承者?" 不是"rubyists倾向于使用什么语言?". (2认同)

Tej*_*eni 6

Ruby it self是一种函数式编程语言,所以我没有看到使用ruby的FP的任何特殊方言.

  • 它是一种函数式编程语言,与刮擦和嗅探贴纸是一种水果的方式大致相同.功能编程的标志是没有副作用.Ruby是编写真正功能代码的最难的语言之一(如果不是最难的话).在Ruby中创建一个真正不可变的数据结构几乎是不可能的(甚至Fixnums也可以添加可变属性).此外,编写许多真正的函数(即lambda函数而不是方法)在Ruby中是单一的,并且函数必须在Procs和块之间不断转换. (5认同)
  • 请参阅http://yellowlab.com.au/blog/2009/09/15/functional-programming-in-ruby/ Ruby并没有真正削减它的FP. (4认同)