質問

機能プログラミングの主な特徴の1つは、副作用機能の使用です。ただし、これは命令的な言語でも行うことができます。同じことが再帰およびラムダ関数にも当てはまります(たとえば、C ++ 0x)。したがって、命令的なプログラミング言語は機能的な言語のスーパーセットであるかどうか疑問に思います。

役に立ちましたか?

解決

一般的に言えば、いいえ。機能プログラミングはのサブセットです 宣言的なプログラミング (これには、Prologのようなロジックプログラミング言語が含まれます)。多くの命令的な言語は、機能的なプログラミング言語から要素を借りますが、単にラムダまたは参照的に透明な関数を持っているだけでも、命令的な言語は機能的ではありません。機能プログラミングは、これらの要素だけではありません。

他のヒント

彼らがお互いのサブセットであるかどうかは本当に言うことができません。しかし、私が言うことができることは、(本当に難解な言語を除く)彼らはすべて チューリングコンプリート, 、つまり、最終的にはそれらはすべて等しく強力であるが、neccescylyは等しく表現力があることを意味します。

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

もう少し明確にするために、あなたの類推を続けましょう。LispとOCAML(たとえば)が機能的言語と見なされ、どちらも命令的なスタイルを許可している場合...命令は機能的なサブセットと見なされるべきですか?

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

機能プログラミングは、独自のよく開発されたプログラミングパラダイムであり、Haskell、LISPなどの言語を通じて最もよく学習します。これらの言語を定期的に使用していなくても、それらをよく学んだ後、それらの原則を使用し始めることができます。定期的に使用する日々の言語。

一部の人々はグーグルのために好きな人もいるかもしれません cのオブジェクト指向プログラミング

ほとんどの命令言語には、一次タイプとして関数がありませんが、ほとんどのfunctionald o。 (C ++と同様、Boost :: function。)

一次タイプごとに、この測定値/変数は、任意のタイプ、int、bool、int-> boolの関数である可能性があります。通常、閉鎖またはバウンド値も含まれますが、同じ関数がありますが、いくつかの引数はすでに記入されています。

これら2つは、機能的なプログラミングが主に存在するものです。

の間で区別を引き出すことは役に立つかもしれないと思います パラダイム言語.

私に、 パラダイム 代表する 「考え方」 (関数、オブジェクト、再帰などの概念と抽象化)が、 言語 オファー 「やり方」 (構文、変数、評価)。

すべて真です プログラミング言語は同等です 彼らがそうであるという意味で チューリングコンプリート 理論的には、チューリングにコンパートル可能な機能を計算し、ユニバーサルチューリングマシンによってシミュレートまたはシミュレートされることができます。

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

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

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

一般的なLISPのようないくつかの言語は、印象的にマルチパラダイム言語です。 LISPで機能的、オブジェクト指向、または手続き上のコードを作成することが可能です。間違いなく、アスペクト指向はすでに一般的なLISPオブジェクトシステムの一部であり、したがって「特別なものはありません」。 LISPでは、言語自体を拡張して必要なことをするために簡単に拡張することができます。したがって、「プログラム可能なプログラミング言語」と呼ばれることもあります。 (ここでは、LISPが一般的なLISPが1つの方言である言語ファミリーを説明していることをここで指摘します)。

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

それを見る1つの方法(それが正しい方法だと言っていないcos私はいかなる手段でもラングデザイナーや理論家ではない)は もしも 言語は本質的に他の何かに変換され、「他の何か」がソースのスーパーセットでなければなりません。したがって、ByteCodeは必然的にJavaのスーパーセットです。 .Net ILは、C#とF#のスーパーセットです。したがって、C#(すなわちLinq)の官能構造は、ILの命令構築物のサブセットです。

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

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

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

たとえば、命令的な言語では利用できないものです。また、カレー機能のような構成要素:

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

ほとんどの必須言語では利用できません

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