36

オブジェクト指向プログラミングと関数型プログラミングの両方を促進するために利用できる言語は何ですか?第一級関数をサポートする言語はどれも機能的であると見なすことができることを私は知っていますが、私は両方のコーディングスタイルを特に対象とした構文を探しています。

このような言語を使用して、すべての状態変化をコードの1つの部分に分離し、プログラムの残りの部分を純粋関数型にすることを想像しています。それを考えるだけで私はよだれを垂らします(天国をデバッグします!)。

これまでのところ、 Scalaを発見したのは聞いたばかりですが(そして、見た目は素晴らしいです)。この「混合スタイル」パラダイムに大きな競争相手はいますか?

4

13 に答える 13

22

Javascript:OOおよび機能的

于 2009-06-18T22:59:08.820 に答える
21

最もよく知られているのはOCamlF#です(これらは漠然とOCaml for .NETとして説明できます)。

Ozのような他の多くのマルチパラダイム言語がありますが、それらは主に教育学的価値があります。対照的に、OCamlは非常に実用的です。それはCとほぼ同じくらい速く、Haskellとほぼ同じくらい美しいです:)

PythonやRubyなどの人気のあるスクリプト言語を使用すると、関数型でプログラミングすることもできます。ただし、「古典的な」関数型言語(およびOCaml)が持つ最も強力な機能の1つであるパターンマッチング(正規表現と間違えないでください)は提供していません。

于 2009-06-18T22:57:45.547 に答える
12

また、Python、Ruby、Luaなどの多くのスクリプト言語にはこの機能がありますが、代数的データ型やパターンマッチングなどの関数型言語の優れた機能の多くが欠けています。

于 2009-06-18T22:57:02.520 に答える
10

Haskell:純粋に機能的で、ほとんどOOはありませんが、先に進んでください。:D

Scala:OOとFPの美しい組み合わせは、10年か2年でJVMのプレミア言語としてJavaを追い抜く可能性があります。Javaプラットフォームに関数型プログラミングをもたらすので、私はそれが好きです。

C#:OOの優れたサポートと、より機能的な機能(ファーストクラスの関数はすでにあります。.net4がもたらす改善点を確認します)

F#:.net言語元々はOOのもののために考案されたC#とは対照的に、特に機能するように構築されています。

Python:OOには最適ですが、FPにはまったく適していません

Javascript:ファーストクラスの関数をサポートしますが、ScalaやF#のようなFP用に特別に設計されたものではありません。PythonIMHOよりもわずかに優れています。

なぜOOとFPを混ぜたいのですか?足がかりとして?

于 2010-01-28T23:23:49.033 に答える
9

私の知る限り、OCamlとF#はOOPとFPを組み合わせた最も人気のある言語です。

Rubyのようなほとんどの言語は関数型プログラミングを混ぜ合わせていますが、多くの人はそれを認識していません。そのような言語は、構文の面などで多くのことが望まれていると思います。

于 2009-06-18T22:57:14.330 に答える
7

JavaScript、Python、Rubyをそのように使用することもできますが、Scalaは関数を静的に入力し、JVMで動作させることで、ワンランク上の機能を実現します。

于 2009-06-18T23:03:48.280 に答える
7

C#。これは必須であり、便利ですが、多くの機能機能も備えています。ラムダ、イテレータ、およびLINQはすべて機能します。

純粋主義者にはあまり魅力的ではないかもしれませんが、私にとってはうまくいきます。

于 2009-06-18T23:43:39.027 に答える
4

あなたは本当に間違った質問をしているのです。あなたの質問は、「OO」プログラミングと「関数型」プログラミングの間に違いがあることを前提としています。この区別は、面白くも関連性もありません。実際、「ファーストクラス関数をサポートする」という基準によれば、Javaでさえ機能します。

しかし、あなたは「純粋関数型」で頭に釘を打ちます。それは興味深い点です。どの言語があなたにそのような参照透過性と純粋さを提供しますか?まあ、あなたが非常に注意しているなら、それらのほとんど。しかし、実際に関数が純粋であることを保証するものは多くありません。私はあなたにそれを提供するいくつかの言語しか考えられません。

それらの1つはHaskellです。Haskellでは、最初から最後まで純粋関数型のプログラムを作成します。副作用はIOと呼ばれるデータ構造に委任され、状態は純粋関数を介して渡すか、モナドにカプセル化することによって処理されます。つまり、コードのごく一部だけがグローバル状態と相互作用し、プログラムの残りの部分は純粋であり、純粋さは言語によって強制される「デバッグ天国」があります。

于 2009-06-18T23:40:58.890 に答える
3

「純度」を主張しない限り、CommonLispはすべてのニーズをサポートします。

于 2009-06-19T01:30:08.063 に答える
1

Python、javascript、common lisp、ruby、smalltalk、haskell、ocaml、頭のてっぺんから。それは本当にエキゾチックな組み合わせではありません。

于 2012-08-17T22:46:40.143 に答える
0

関数型プログラミングとオブジェクト指向プログラミングをうまく実行する言語でとにかくそれを行うのではなく、特にそれを混ぜることを奨励する言語を探しているのはなぜですか?Python、Ruby、Perl、または同様のインタプリタ言語で簡単に有効にできます。さらに、Cベースのオブジェクト指向言語は純粋なCとオブジェクト指向機能を組み合わせる傾向があります。たとえば、Objective Cは、必要に応じてそのような方法で簡単に記述できます。

編集:私は自分が間違っていることに気づきました。誰かが私の間違いから学ぶことができる場合に備えて、この答えをここに残しました-コメントを参照してください。

于 2009-06-18T23:09:02.763 に答える
0

私の経験では、C#はこの目的に非常に適しています。C#では、uは関数を委任でき、拡張メソッドを使用しても、FPを念頭に置いてOOPの動作を模倣できます。

私は通常、必要な動作を備えたクラスを構築し、次にFPプラクティスを使用してその周りのダーティな作業を行うためのいくつかの関数を構築します。これはうまく機能します。

私の意見では、PureFPとPureOOPはどちらも、他の人にはないいくつかの欠点をもたらします。OOPはコードを複雑にする傾向がありますが、FPは、特に状態が不可欠な場合に、一部の企業がコーディングを困難にします。

于 2021-11-13T06:00:43.760 に答える
-1

ルビー!Rubyでは、すべてがオブジェクト(リテラルも含む)であり、関数型プログラミングも完全にサポートされています。

于 2009-06-18T22:58:06.700 に答える