Java の人が Scala に行き、C# が F# に行くとしたら、Ruby の人は機能的ニルヴァーナを求めてどこに行くのでしょうか?[閉まっている]

StackOverflow https://stackoverflow.com/questions/2254368

質問

Scala は JVM 上で動作するため、多くの Java 関係者が Scala に注目し始めていることは知っていますし、Microsoft 業界の多くの人々が F# に注目していることは知っていますが、Ruby には自然な機能の後継としてどのようなものがあるのでしょうか?

純粋な FP の観点から言えば、Ruby には不足しているものは何もありません。むしろ、多すぎると言う人もいるかもしれません。関数型言語では、プログラマはグローバル変数やその他のイディオムをあまり使用しないよう強制されます (ただし、関数型言語でグローバルを使用することは可能です)。

役に立ちましたか?

解決

2つあります とても 「関数型プログラミング」の意味にはさまざまな定義があります。Ruby では 1 つはある程度実行できますが、もう 1 つは実行できません。

これら 2 つの定義は次のとおりです。

  • ファーストクラス関数を使用したプログラミングと
  • 数学関数を使用したプログラミング

Ruby では、ファーストクラスの関数を使用して一種のプログラムを作成できます。ファーストクラスの関数をサポートしています。実際、それは 過度に 彼らへのサポート:がある Proc.new, proc, lambda, Method, UnboundMethod, 、ブロック、 #to_proc そして ->() (そしておそらく私が忘れている他のものも)。

これらすべて 少し違った振る舞いをする, 、構文、動作、制限がわずかに異なります。例えば:これらの中で、実際に高密度で使用できるほど構文的に軽量なものは、ブロックだけです。ただし、ブロックにはかなり厳しい制限があります。メソッドに渡せるブロックは 1 つだけです。ブロックはオブジェクトではありません (オブジェクト指向言語では、「すべてがオブジェクトである」という意味です)。 とても 厳しい制限)、少なくとも Ruby 1.8 ではパラメータに関していくつかの制限もあります。

メソッドを参照するのもかなり厄介です。で パイソン または ECMAScript たとえば、次のように言えます。 baz = foo.bar を参照する bar の方法 foo 物体。ルビーでは、 foo.bar 方法です 電話, を参照したい場合は、 bar の方法 foo, 、 私は言わないといけない baz = foo.method(:bar). 。そしてもし私が今そうしたいなら 電話 その方法、としか言えません baz(), 、 私は言わないといけない baz.call または baz[] または (Ruby 1.9 の場合) baz.().

したがって、Ruby のファーストクラス関数はそうではありません。 本当に ファーストクラス。彼らは二流よりもはるかに優れており、 十分です™ ですが、完全に一流というわけではありません。

しかし一般的に、Rubyist はファーストクラスの関数のためだけに Ruby を離れることはありません。Ruby のサポートは十分に充実しているため、別の言語でのより良いサポートから得られる利点は、通常、新しい言語のトレーニングや何かによって費やされてしまいます。 それ以外 あなたはそれに慣れているので、もうあきらめなければなりません。たとえば、RubyGems や緊密な Unix 統合、Ruby on Rails や構文など…

しかし 2番 FP の定義は、Ruby が完全に当てはまるところです。Ruby で数学関数を使用したプログラミングを実行したい場合は、苦痛の世界が待っています。Ruby ライブラリの絶対的な大部分は使用できません。そのほとんどはステートフルで効果的であり、突然変異を促進するか、その他の点で不純であるためです。同じ理由で標準ライブラリは使用できません。コアライブラリは使用できません。コア データ型はすべて変更可能であるため、使用できません。「それらが変更可能であることは気にしません。単に変更せず、常にコピーします。」と言うこともできますが、問題は次のとおりです。他の誰かがそれらを突然変異させることができます。また、それらは可変であるため、Ruby はコピーを最適化できず、ガベージ コレクターはその種のワークロード向けに調整されていません。

それはうまくいきません。

また、関数型プログラミングとはまったく関係がないものの、ほとんどの関数型言語には備わっている傾向にあり、Ruby には欠けている機能もいくつかあります。たとえばパターンマッチング。怠惰も以前はそう簡単には達成できませんでした EnumeratorRuby 1.9 では、より積極的に使用されました。そして、厳密な条件で動作するものがまだいくつかあります Enumerableまたは Arrayだけど怠け者ではない Enumerator実際にはそうする理由はありませんが、 必要とする 厳しさ。

そして、のために これ FP の定義を考慮すると、Ruby を残すのは間違いなく理にかなっています。

Rubyist が群がっている主な言語は次の 2 つです。 アーラン そして クロージュア. 。これらは両方とも Ruby に比較的よく適合します。なぜなら、両方とも動的に型付けされ、Ruby と同様の REPL 文化を持ち、(これは Ruby というよりも Rails に関するものです) Web 上でも非常に優れているからです。彼らにはまだかなり小規模で歓迎的なコミュニティがあり、オリジナルの言語作成者はまだコミュニティで活動しており、新しい、エキサイティングで最先端のことを行うことに重点が置かれており、これらすべてが Ruby コミュニティにも備わっている特徴です。

Erlang への関心は、誰かが 1993 年のオリジナルの紹介ビデオを見せたときに始まりました。アーラン:映画」RubyConf 2006にて。たとえば、いくつかの注目度の高い Rails プロジェクトは Erlang を使用し始めました。 パワーセット そして GitHub. 。Erlang は、それほど純粋性を必要としないため、Rubyist にとっても習得が簡単です。 ハスケル または クリーン. 。の 内部 俳優のメッセージは非常に純粋ですが、メッセージを送信する行為自体にはもちろん副作用が伴います。Erlang を理解しやすくするもう 1 つの点は、以下に従うと、アクターとオブジェクトは実際には同じものであるということです。 アラン・ケイによるオブジェクト指向プログラミングの定義.

Clojure は、Rubyist のツールベルトに最近追加されました。その人気の主な原因は、Ruby コミュニティが最終的に JVM ≠ Java という考えに慣れてきて、これを受け入れたという事実によるものだと思います。 JRuby それから彼らは周りを見回し始めました 他の JVM には興味深いものがありました。繰り返しになりますが、Clojure は、Haskell などの他の関数型言語や他の Lisp よりもはるかに実用的です。 スキーム CommonLisp よりもはるかにシンプルで最新なので、Rubyist にとって自然に適合します。

Clojure のもう 1 つの優れた点は、Clojure と Ruby の両方が JVM 上で実行されるため、 組み合わせる 彼ら。

』の著者Clojure のプログラミング「(Stuart Halloway)は、たとえば(元?)Rubyistです。 フィル・ヘーゲルバーグ, の著者です。 ライニンゲン Clojure 用のビルド ツール。

ただし、Rubyist は両方とも検討しています。 スカラ座 (より実用的な静的型付け FP 言語の 1 つとして)、および Haskell (より洗練された言語の 1 つとして)。それから次のようなプロジェクトがあります スキュービー そして 自信過剰 これらは、それぞれ Ruby を Scala および Haskell と統合できるようにするブリッジです。低レベルのメッセージング インフラストラクチャの一部をまず MySQL から Ruby に移行し、次に Ruby から Scala に移行するという Twitter の決定も、かなり広く知られています。

F# おそらく Ruby コミュニティがマイクロソフトのあらゆるものに対して不合理な恐怖を抱いているためかもしれません。(ところで、F# チームが次のことを行っていることを考えると、これはほとんど根拠がないようです。 いつも Mono で利用できるバージョンを作成しました)。

他のヒント

のJavaの人はJVM上の言語を使用して、そのランタイムと互換性がより機能的なものをしたいので、彼らは、スカラ座に行くされています。

C#の人々はCLR上で言語を使用して、そのランタイムと互換性がより機能的なものをしたいので、彼らは、F#1に行くされています。

Rubyの人々は、すでにかなりの機能だ言語を使用している、と彼らは、基礎となるランタイム(JRubyの、IronRubyを、MRI、MacRubyの、Rubiniusの、等...)の数にそれを使用しています。私はそれが自然な機能後継者を持っていると思うか、一つでも必要ありません。

のLispのすべてのバージョンは問題ないはずです。

Rubyのそれのセルフは関数型プログラミング言語の一種である、だから私はルビーを使用してFPのための特別な方言が表示されません。

誇大広告レベルで、ハスケル。

Rubyの人々はJVM自身に行っていないと仮定すると、私はほとんどの他の動的型付け言語であること、アーランを採用すると思います。

RubyはLispが言うほどの機能はありませんが、あなたが楽しいの方法で、いくつかの関数型プログラミングを行うことができますことを十分にちょうど機能です。 (C#のようなもので、関数型プログラミングをやろうとしているとは異なります)。

また、それは実際にそのようなブロックや歩留まりを多用としてその構文の一部で機能的なパラダイムにあなたを強制します。 (これは私は、Rubyを学習した後と恋に落ちました)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top