オブジェクト指向プログラミングと関数型プログラミングの混合
-
06-07-2019 - |
質問
オブジェクト指向プログラミングと関数型プログラミングの両方を促進する言語は何ですか?ファーストクラスの機能をサポートする言語はいずれも機能的と見なすことができることは知っていますが、両方のコーディングスタイルを特に対象とする構文を探しています。
このような言語を使用して、すべての状態変更をコードの単一部分に分離し、プログラムの残りの部分を純粋に機能させることを想像しています。それを考えるだけでよだれが出ます(天国をデバッグ!)。
これまでに Scala を発見しましたが、聞いたばかりですがすごいですね)。この「混合スタイル」には大きな競争相手がいますか?パラダイム?
他のヒント
また、Python、Ruby、Luaなどの多くのスクリプト言語にはこの機能がありますが、代数的データ型やパターンマッチングなどの関数型言語の優れた機能の多くが欠けています。
OCamlとF#は、私が知る限り、OOPとFPを組み合わせた最も人気のある言語です。
Rubyのようなほとんどの言語には関数型プログラミングが組み込まれていますが、多くの人はそれを認識していません。そのような言語は、構文の面などで望まれるものがたくさん残っています。
Haskell :純粋に機能的で、オブジェクト指向はほとんどありませんが、先に進み、飛び込みましょう。 :D
Scala :OOとFPの美しいミックスは、おそらく10年または2年でJVMの主要な言語としてjavaを追い抜く可能性があります。私見が必要です。
C#:OOの優れたサポートと、より機能的な機能(ファーストクラスの機能はすでにあります。.net4がもたらす改善点を確認します)
F#:.net言語もともとオブジェクト指向向けに考案されたC#とは対照的に、特に機能するように構築されています。
Python :オブジェクト指向には最適ですが、 FPにはまったく適していません
Javascript :ファーストクラスの機能をサポートしますが、ScalaやF#などのFP用に特別に設計されたものではありません。まだPython IMHOよりもわずかに優れています。
OOとFPを混合する理由飛び石として?
C#。これは必須であり、便利ですが、多くの機能的な機能も備えています。ラムダ、イテレータ、およびLINQはすべて機能します。
おそらく純粋主義者にはあまり魅力的ではないでしょうが、私には有効です。
JavaScript、Python、Rubyはそのように使用できますが、 Scala はノッチを上げます関数を静的に入力し、JVMで動作します。
あなたは本当に間違った質問をしている。あなたの質問は、「OO」との区別があることを前提としています。および「機能」プログラミング。この区別は、面白くも関連性もありません。実際、「一流の機能をサポート」によると、基準、 Javaが機能している。
しかし、あなたは「純粋に機能的」で頭に釘を打ちます。それは興味深いビットです。そのような参照の透明性と純度を提供する言語は何ですか?まあ、それらのほとんどは、あなたが非常に注意している場合は ですが、それらの多くはあなたの関数が純粋であることを実際に保証しません。私はあなたにそれを提供するいくつかの言語しか考えられません。
そのうちの1つは Haskell です。 Haskellでは、最初から最後まで純粋に機能するプログラムを作成します。副作用はIOと呼ばれるデータ構造に委任され、状態は純粋な関数に渡すかモナドにカプセル化することで処理されます。これで、「デバッグ天国」ができました。コードのごく一部のみがグローバル状態と対話し、プログラムの残りの部分は純粋であり、言語によって純度が強制されます。
「純度」を主張しない限り、Common Lispはすべてのニーズをサポートします。
関数型プログラミングやオブジェクト指向プログラミングを上手く実行する言語でとにかくやるのではなく、特にそれを混ぜることを奨励する言語を探しているのはなぜだろうか? Python、Ruby、Perl、または同様のインタープリター言語で簡単に有効になります。さらに、CベースのOO言語は、純粋なCとOO機能を混在させる傾向があります。たとえば、Objective Cは、必要に応じて簡単に作成できます。
編集:自分が間違っていることに気づきました。誰かが私の間違いから学ぶことができるように、この答えをここに残しました-コメントを参照してください。
Python、javascript、Common Lisp、Ruby、Smalltalk、Haskell、およびocaml。本当にエキゾチックな組み合わせではありません。
ルビー! Rubyでは、すべてがオブジェクト(リテラルも含む)であり、完全に機能するプログラミングサポートも備えています。