9

関数型プログラミングの主な特徴の 1 つは、副作用のない関数の使用です。ただし、これは命令型言語でも実行できます。再帰関数とラムダ関数 (C++0x など) についても同じことが言えます。したがって、命令型プログラミング言語は関数型プログラミング言語のスーパーセットなのだろうか。

4

9 に答える 9

21

それらがお互いのサブセットであるかどうかは本当に言えません。しかし、私が言えることは、(本当に難解な言語を除いて)それらはすべてチューリング完全であるということです。つまり、最終的にはすべて同じように強力ですが、必ずしも同じように表現できるわけではありません。

于 2009-11-23T14:17:09.813 に答える
9

一般的に言って、いいえ。関数型プログラミングは、宣言型プログラミング(Prologなどの論理プログラミング言語を含む)のサブセットです。多くの命令型言語は関数型プログラミング言語から要素を借用していますが、ラムダまたは参照透過性関数を持っているだけでは命令型言語は機能しません。関数型プログラミングは、これらの要素以上のものです。

于 2009-11-23T14:21:50.930 に答える
4

パラダイムは物事を行う方法であり、2つの主要なプログラミングパラダイムがあります。命令型と宣言型です。一部の言語で両方のパラダイムを混在させることができるという事実は、一方が他方に含まれていることを意味するのではなく、言語マルチパラダイムであることを意味します。

もう少し明確にするために、あなたのアナロジーを続けましょう:LispとOCaml(たとえば)が関数型言語と見なされ、両方が命令型を許可する場合...命令型は関数型のサブセットと見なされるべきですか?

于 2009-11-23T14:18:28.797 に答える
4

プログラミング パラダイムをネイティブにサポートしていない言語で、特定のプログラミング パラダイムを実装することは可能です。たとえば、この目的のために設計されていない場合でも、C でオブジェクト指向コードを作成することは可能です。

関数型プログラミングは、それ自体が十分に発達したプログラミング パラダイムであり、Haskell や LISP などの言語を通じて学習するのが最適です。これらの言語を十分に学習した後は、これらの言語を定期的に使用しなくても、これらの原則を使用し始めることができます。日常的に日常的に使用する言語。

一部の人々は、C でのオブジェクト指向プログラミングを Google で検索することを好むかもしれません。

于 2009-11-23T14:15:42.813 に答える
2

パラダイム言語を区別することは役立つと思います。

私にとって、パラダイム「考え方」 (関数、オブジェクト、再帰などの概念と抽象化)を表し、言語は「やり方」 (構文、変数、評価)を提供します。

すべての真のプログラミング言語は、チューリング完全であり、理論上、チューリング計算可能な関数を計算できるだけでなく、ユニバーサル チューリング マシンによってシミュレートまたはシミュレートできるという意味で同等です。

興味深いのは、特定のタスクを特定の言語またはパラダイムで達成することがどれほど難しいか、ツールがそのタスクにどれほど適しているかです。コンウェイのライフ ゲームでさえチューリング完全ですが、それを使ってプログラミングしたいとは思いません。

多くの言語は、多くのパラダイムをサポートしています。C++ は C のオブジェクト指向拡張機能として設計されましたが、純粋に手続き型のコードを記述できます。

一部の言語は、時間の経過とともに他の言語またはパラダイムから機能を借用または取得します (Java の進化を見てください)。

Common Lisp のようないくつかの言語は、印象的なマルチパラダイム言語です。Lisp では、関数型、オブジェクト指向、または手続き型のコードを書くことができます。ほぼ間違いなく、アスペクト指向はすでに Common Lisp オブジェクト システムの一部であるため、「特別なことは何もありません」。Lisp では、言語自体を拡張して必要なことを実行するのは簡単であるため、「プログラム可能なプログラミング言語」と呼ばれることもあります。(ここで指摘しておきますが、Lisp は Common Lisp が 1 つの方言に過ぎない言語のファミリーを記述しています)。

宣言型、命令型、関数型、または手続き型のどの用語がそのサブセットであるかは問題ではないと思います。さらに重要なことは、使用しているツール言語と、それらが他のツールとどのように異なるかを理解することです。さらに重要なのは、パラダイムが表すさまざまな考え方を理解することです。それらは思考ツールだからです。人生の他のほとんどのことと同様に、理解すればするほど、より効果的になります。

于 2009-11-23T18:30:23.173 に答える
2

それを見る1つの方法(「私は言語の設計者でも理論家でもないので、それが正しい方法であるとは決して言いません)は、言語が本質的に何か他のものに変換される場合、その「他のもの」はのスーパーセットでなければならないということです起源。したがって、バイトコードは必然的に Java のスーパーセットです。.NET IL は、C# と F# のスーパーセットです。したがって、C# の関数構造 (つまり LINQ) は、IL の命令構造のサブセットです。

機械語は命令型なので、すべての言語は命令型であるという立場を取ることができます。なぜなら、それらは人間にとって有用な単なる抽象化であり、コンパイラによって手続き型の命令型機械語コードに煮詰められるからです。

于 2010-02-18T23:47:30.070 に答える
2

ほとんどの命令型言語は一次型として関数を持っていませんが、ほとんどの関数型言語は o です。(C++ と同様に、boost::function を使用します。)

一次型によって、これは値/変数が任意の型、int、bool、int->bool の関数であることを意味します。通常、クロージャーまたはバインドされた値も含まれます。同じ関数がありますが、いくつかの引数は既に入力されています。

これらの 2 つは、関数型プログラミングの主な目的です。

于 2009-11-23T15:45:58.980 に答える
1

のようなパターン マッピング

f:: [int] -> int
f [] = 0
f (x:xs) = 1 + f(xs)

たとえば、命令型言語では利用できないものです。また、カリー化された関数のように構築します:

add2 :: int -> int
add2 = (2 +)

ほとんどの命令型言語では利用できません

于 2009-11-23T15:50:19.283 に答える