Java の人が Scala に行き、C# が F# に行くのなら、Ruby の人は関数型の涅槃をどこへ求めるのでしょうか? [closed] 質問する

Java の人が Scala に行き、C# が F# に行くのなら、Ruby の人は関数型の涅槃をどこへ求めるのでしょうか? [closed] 質問する

Scala は JVM 上で実行されるため、多くの Java ユーザーが Scala に注目し始めていること、また Microsoft の世界では多くの人が F# に注目していることは知っていますが、Ruby には自然な関数型後継として何があるのでしょうか?

純粋なFPの意味で言えば、Rubyには何も欠けているわけではありません。むしろ、ある人は多すぎると言うかもしれません。関数型言語では、プログラマーはグローバル変数やその他の慣用句をあまり使用しないように強制されます(関数型言語でもグローバルを使用することは可能ですが)。

ベストアンサー1

2つありますとても「関数型プログラミング」の意味についての異なる定義。Ruby では、ある意味は実行できますが、他のことは実行できません。

その 2 つの定義は次のとおりです。

  • 第一級関数を使ったプログラミングと
  • 数学関数を使ったプログラミング

Rubyでは、第一級関数を使ってプログラミングすることができます。第一級関数をサポートしています。実際、過度にProc.newそれらのサポート: 、、、、、ブロック、および(おそらく私が忘れている他のいくつか) がprocあります。lambdaMethodUnboundMethod#to_proc->()

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

方法を参照するのもかなり厄介なことです。パイソンまたはECMAスクリプト例えば、オブジェクトのメソッドbaz = foo.barを参照すると言うことができます。Rubyでは、メソッドはbarfoofoo.bar電話bar、の方法について言及したい場合foo、私はこう言わなければなりませんbaz = foo.method(:bar)。そして、私が今、電話その方法では、 とだけ言うことはできず、またはまたは (Ruby 1.9 の場合) とbaz()言わなければなりません。baz.callbaz[]baz.()

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

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

しかし2番FP の定義は、Ruby が見事に失敗するところです。Ruby で数学関数を使用してプログラミングを行う場合、大変な苦労を強いられます。Ruby ライブラリの絶対多数は使用できません。ほとんどのライブラリが状態を持ち、有効で、変更を奨励するか、またはその他の点で不純だからです。同じ理由で標準ライブラリも使用できません。コア ライブラリも使用できません。コア データ型はすべて変更可能であるため、使用できません。「変更可能であることは気にしないので、変更せずに常にコピーする」と言えばよいのですが、問題は、他の誰かが変更できるということです。また、変更可能であるため、Ruby はコピーを最適化できず、ガベージ コレクターはそのようなワークロードに合わせて調整されていません。

それは機能しません。

また、関数型プログラミングとはまったく関係のない機能もいくつかありますが、ほとんどの関数型言語には備わっていて、Rubyには欠けています。たとえば、パターンマッチングです。遅延性も、Ruby 1.9で が積極的に使用されるようになるまでは、実現するのはそれほど簡単ではありませんでした。また、strictやでは機能するが、lazy では機能しないEnumeratorものもいくつかありますが、実際には、それらを機能させる理由はありません。EnumerableArrayEnumerator必要とする厳しさ。

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

Rubyユーザーが集まる2つの主な言語は、アーランそしてクロージュアこれらはどちらも Ruby と比較的相性が良いです。なぜなら、どちらも動的型付けで、Ruby と似た REPL 文化を持ち、(これは Ruby というより Rails に関係しますが) Web 上でも非常に優れているからです。どちらもまだかなり小規模で親しみやすいコミュニティがあり、元の言語の作成者は今でもコミュニティで活動しており、新しくてエキサイティングで最先端のことをすることに重点が置かれています。これらはすべて、Ruby コミュニティにも備わっている特徴です。

Erlangへの関心は、誰かが1993年のオリジナルの紹介ビデオを見せたときに始まりました。アーラン:映画」という記事をRubyConf 2006で発表しました。いくつかの有名なRailsプロジェクトはErlangを使い始めました。例えばパワーセットそしてGitHubErlangはRubyユーザーにとっても習得しやすい言語です。なぜなら、Erlangは純粋さをそれほど追求していないからです。ハスケルまたはクリーン内部アクターの振る舞いは極めて純粋ですが、メッセージを送るという行為自体は当然副作用です。Erlangを理解しやすくするもう1つの点は、アクターとオブジェクトは実際には同じものであるということです。アラン・ケイによるオブジェクト指向プログラミングの定義

Clojureは最近Rubyistのツールベルトに加わった。その人気は、RubyコミュニティがついにJVM≠Javaという考え方に共感し、ルビーそして彼らは周りを見回し始めました他のJVMには興味深いものがありました。そして、ClojureはHaskellのような他の関数型言語や、他のLispのような他の言語よりもはるかに実用的です。スキームCommonLisp よりもはるかにシンプルでモダンなので、Ruby ユーザーに最適です。

Clojureのもう一つの素晴らしい点は、ClojureとRubyの両方がJVM上で動作するため、組み合わせる彼ら。

Clojureプログラミング「(スチュアート・ハロウェイ)は(元?)Rubyistであり、フィル・ハゲルバーグの著者であるライニンゲンClojure 用のビルド ツール。

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

ファ#まったく役割を果たしていないように思われますが、これはおそらく、RubyコミュニティがMicrosoftのあらゆるものに対して抱いている不合理な恐怖感のせいでしょう。(ちなみに、F#チームがいつもMono用のバージョンも利用可能になりました。

おすすめ記事