如果 Java 人转向 Scala,C# 转向 F#,那么 Ruby 人该去哪里寻求函数式涅槃呢?[关闭]
-
20-09-2019 - |
题
我知道很多 Java 人已经开始关注 Scala,因为它运行在 JVM 上,而 Microsoft 世界的很多人都在关注 F#,但是 Ruby 有什么作为天然的功能继承者呢?
从纯粹的 FP 意义上来说,Ruby 并不缺少任何东西,相反,有些人可能会说它太多了。函数式语言迫使程序员不要过多使用全局变量和其他习惯用法(尽管可以在函数式语言中使用全局变量)
解决方案
有两个 非常 “函数式编程”的含义有不同的定义。您可以在 Ruby 中执行其中一个操作,但不能执行另一个操作。
这两个定义是:
- 使用一流的函数进行编程和
- 使用数学函数进行编程
您可以在 Ruby 中使用一流的函数进行编程。它支持一流的功能。事实上,它有 太多了 对他们的支持:有 Proc.new
, proc
, lambda
, Method
, UnboundMethod
, 块, #to_proc
和 ->()
(可能还有其他一些我忘记的)。
所有这些 行为略有不同, ,具有稍微不同的语法、稍微不同的行为和稍微不同的限制。例如:其中唯一一个在语法上足够轻量级以至于您实际上可以密集使用它的就是块。但区块有一些相当严格的限制:您只能将一个块传递给方法,块不是对象(在面向对象的语言中,“一切都是对象”是一种 非常 严格的限制)并且至少在 Ruby 1.8 中还有一些关于参数的限制。
引用方法是另一件相当尴尬的事情。在 Python 或者 ECMA脚本 例如,我可以说 baz = foo.bar
参考 bar
的方法 foo
目的。在红宝石中, foo.bar
是一种方法 称呼, ,如果我想参考 bar
的方法 foo
, , 我不得不说 baz = foo.method(:bar)
. 。如果我现在想要 称呼 那个方法,我不能只是说 baz()
, , 我不得不说 baz.call
或者 baz[]
或(在 Ruby 1.9 中) baz.()
.
所以,Ruby 中的一流函数不是 真的 一流的。他们比二等人好多了,而且他们 够好了™,但它们并不完全是一流的。
但一般来说,Ruby 主义者不会仅仅为了一流的功能而放弃 Ruby。Ruby 的支持足够好,以至于您可能从另一种语言的更好支持中获得的任何优势通常都会被新语言的培训工作或其他原因所抵消。 别的 你已经习惯了,但现在必须放弃。比如 RubyGems 或紧密的 Unix 集成或 Ruby on Rails 或语法或......
但是,那 第二 FP 的定义是 Ruby 失败的地方。如果您想在 Ruby 中使用数学函数进行编程,那么您将面临一个痛苦的世界。您不能使用绝大多数 Ruby 库,因为它们中的大多数都是有状态的、有效的、鼓励突变的或者是不纯粹的。出于同样的原因,您不能使用标准库。您无法使用核心库。您不能使用任何核心数据类型,因为它们都是可变的。你可以只是说“我不在乎它们是可变的,我不会改变它们并总是复制它们”,但问题是:其他人仍然可以改变它们。此外,由于它们是可变的,Ruby 无法优化复制,并且垃圾收集器也无法针对此类工作负载进行调整。
它就是行不通。
还有一些功能实际上与函数式编程无关,但大多数函数式语言往往都具有,而 Ruby 却缺少这些功能。例如,模式匹配。以前的懒惰也不是那么容易实现的 Enumerator
Ruby 1.9 中更积极地使用了 s。还有一些东西可以严格使用 Enumerable
或 Array
s 但不是懒惰的 Enumerator
s,尽管实际上他们没有理由这样做 要求 严格。
而对于 这 根据 FP 的定义,将 Ruby 抛在后面绝对是有意义的。
Rubyists 蜂拥而至的两种主要语言是 埃尔兰 和 克洛尤尔. 。它们对于 Ruby 来说都是相对较好的匹配,因为它们都是动态类型的,具有与 Ruby 类似的 REPL 文化,而且(这更像是 Rails 的东西,而不是 Ruby 的东西)在 Web 上也非常好。他们仍然拥有相当小而热情的社区,原始语言的创建者仍然活跃在社区中,非常注重做新的、令人兴奋的和前卫的事情,所有这些都是 Ruby 社区所具有的特征。
当有人展示了 1993 年的原始介绍视频“时,人们对 Erlang 产生了兴趣”埃尔兰:电影” 在 RubyConf 2006 上。例如,一些备受瞩目的 Rails 项目开始使用 Erlang 电源设置 和 GitHub. 。对于 Ruby 爱好者来说,Erlang 也很容易掌握,因为它并不需要那么纯粹。 哈斯克尔 或者 干净的. 。这 里面 演员的行为是相当纯粹的,但发送消息本身的行为当然是一个副作用。使 Erlang 易于掌握的另一件事是,Actors 和 Objects 实际上是同一件事,当你遵循 Alan Kay 对面向对象编程的定义.
Clojure 是 Rubyist 工具带中最近新增的成员。我想它的流行主要是由于 Ruby 社区终于接受了 JVM ≠ Java 的想法并接受了这一事实 JRuby 然后他们开始环顾四周 其他 JVM 上有一些有趣的东西。再说一遍,Clojure 比 Haskell 等其他函数式语言和其他 Lisp 语言(如 方案 而且比 CommonLisp 更简单、更现代,因此它非常适合 Rubyists。
Clojure 的另一个很酷的事情是,因为 Clojure 和 Ruby 都运行在 JVM 上,所以您可以 结合 他们。
《的作者》Clojure 编程“(斯图尔特·哈洛威)是一位(前?)红宝石主义者,例如 菲尔·哈格尔伯格, ,该书的作者 莱宁根 Clojure 的构建工具。
然而,红宝石主义者也同时关注这两个方面 斯卡拉 (作为更实用的静态类型 FP 语言之一)和 Haskell(作为更优雅的语言之一)。然后还有像这样的项目 斯库比 和 狂妄自大 它们是让您分别将 Ruby 与 Scala 和 Haskell 集成的桥梁。Twitter 决定首先将其部分低级消息基础设施从 MySQL 迁移到 Ruby,然后从 Ruby 迁移到 Scala,这一决定也广为人知。
F# 似乎根本没有发挥任何作用,可能是由于对 Microsoft Ruby 社区拥有的所有东西的非理性恐惧。(顺便说一句,这似乎几乎没有根据,因为 F# 团队已经 总是 提供了适用于 Mono 的版本。)
其他提示
Java的人都在使用的JVM语言,并希望与他们的运行时功能更强大的一个兼容的,所以他们去斯卡拉。
C#的人正在使用的CLR语言,并希望与他们的运行时功能更强大的一个兼容的,所以他们去F#。
红宝石人都在使用这已经是相当有功能的语言,他们正在使用它的一些基本的运行时间(JRuby中,IronRuby的,MRI,MacRuby的,Rubinius的,等等)的。我不认为它有一个天然的功能的继任者,甚至是需要的。
任何版本的Lisp的要细。
红宝石它的自我是一种函数式编程语言的,所以,使用Ruby我看不出有任何特殊的方言为FP。
在宣传水平,Haskell中。
假设Ruby的人不只是去JVM本身,我想大多数人会采取二郎,是另一种动态类型语言。
Ruby是不是功能性的说Lisp的,但它只是功能不够,你可以在一个良好的有趣的方式做了一些函数式编程。 (不像试图做在像C#功能编程)
此外,它实际上迫使你成在它的一些语法,功能范例,例如大量使用块和产量的影响。 (我爱上了学习Ruby后)。