関数型プログラミング言語または論理プログラミング言語、あるいはその両方をもっと使用する必要がありますか?


8

いくつかのuniコースの一部としてHaskellとPrologを少しプログラムしましたが、それはそれで終わりです。そして、それが業界で使用されるのを見たことがありません(最初から多くの実務経験があったわけではありませんが、それらを知る必要がある広告を見たことがありません)。

では、関数型プログラミング言語やロジックプログラミング言語をもっと頻繁に使用するべきでしょうか?それらを使用するか使用しないことの利点または欠点はありますか?

回答:


9

私は仕事に適したツールを使用することを信じています。命令型言語と関数型言語の両方があり、一方をもう一方よりも強く使用する必要はありません。

長所/短所については、「なぜ関数型プログラミングがまだ引き継がれていないのか」に対するEric Lippertの答えに勝てないと思います。SO質問。


うーん?なぜ反対票か。
アダムリア

1
私は反対票を投じていませんが、彼の答えには同意しません(たとえば、「誤解」の同時実行性と並列処理-機能的な世界では、これらの用語は2つの異なることを意味します)。しかし、それは悪い答えだとは思いません。
Maciej Piechotka

実際、Eric Lippert'sは非常に有益な回答でした。方向をありがとう。
gablin

5

まず第一に-コンパイラはもっともっとやらなければならないからです。命令型コンパイラを作成したい場合は、アセンブラへの1-1変換をほぼ行うことができ、生成されたコードは許容可能な速度になります(確かに、やることはたくさんありますが、「基本的に」1-1コンパイル+最適化です)。関数型コンパイラは、非常に重いインライン化、末尾呼び出しの最適化などを処理する必要があります。したがって、関数型言語の実装はC / C ++ / ...よりもはるかに遅くなりました(ただし、コンパイラが向上するにつれて、反復ごとに速度が大幅に向上します)。

第二に-プログラマーは、「だまされていない...状態」のアプローチを「受け入れる」ことができないと述べるのに慣れています。確かに-状態の欠如は各条件で有用ではありませんが、(グローバル)状態の欠如はローカルな状態の欠如を意味しません。

第三に、関数型プログラミングにはその裏に素敵な話はありません。オブジェクトは名詞にマッピングされ、直感的に操作できるので、OOPには素晴らしいストーリーがあります。その後、昇格される可能性のあるManagerasのサブクラスEmployeeとしてクラスを作成できず、デコレーターをいじる必要があるため、それほど単純ではないことがわかります。関数型プログラムには数学の話があります。これは、IMHOの方が便利ですが、市場性は低くなります。EmployeeManager

内部的にはコンピューターの観点から-並列コンピューティングと並行コンピューティングの間に違いはありません。多くのプログラマーは違いを見ず、多くの言語は同じプリミティブで両方を処理します。関数型プログラミング言語にはローカル状態と軽量スレッドがないため、アルゴリズムの並列化ははるかに簡単です。ただし、並行プログラミングはグローバルな状態に関するものであるため、並行プログラミングは自動的に容易にはなりません。

最後に-命令型で書かれた古いプログラムがたくさんあります。命令型言語から命令型言語への移植でさえ、関数型言語よりもはるかに簡単です。

私の知る限り、投資銀行は内部で機能的なプログラムを採用し始めているため、XXIに参加しますc。(非常に重要ですが、隠れた領域です)-勢いを増します。

PS。関数型プログラムは、他のアプローチよりも複雑さを隠すという意味で「優れている」と思いますが、本質的に必須のスクリプトなどの領域がないということではありません。


2

プログラミング言語は、情報の表現形式です。この場合、コンピュータが従うべき指示。ただし、表現は対象読者(つまりプログラマー)にとっても重要です。

機能的/論理的な概念は、手続き型の概念ほど日常生活で一般的に使用されるものではありません。手順(テレビ、DVDプレーヤーの使用方法、IKEAから家具の製造方法など)を読んだ場合、手順は(自然言語ではありますが)ほとんどが手順に従って書かれています。

したがって、数学や科学にそれほど深く関わっていない多くの人々は、論理的または機能的な概念よりも、そのような手続きの概念にはるかに精通していることがよくあります。

これは、使用するプログラミング言語のクラスの選択に大きな影響を与えると思います。結局のところ、そのようなプログラミング言語で解決できる一連の問題は、ほとんど同じです(すべてが完全に解決している限り)。

ただし、多くの手続き型言語は、他の概念の面をますます取得しています。Pythonはラムダ計算とクロージャー、ルビーも実行できます。業界でひどく使用されているJavascriptは、実際には実際には関数型言語です(ほとんどの人が「誤用」する場合でも、手続き型の方法で使用することによります)。したがって、それらの機能を適切な場所で適切に使用することは、実際にはプログラマの仕事です。


1
JavaScriptが関数型言語になるのはいつからですか?
Jonas

1
@ジョナス-それは確かに関数型言語であり、常にそうでした。もちろん、JavaScriptのように、言語は一度に多くのパラダイムに従うことができます。
ChaosPandion

1
@ChaosPandion:クロージャーと高次関数があるからといって?:)
Jonas

@ジョナス-確かに、明らかにここではHaskellについて話していませんが、機能的であるとは言えます。
ChaosPandion

2
問題への一般的なアプローチを慣用的な方法で検討する必要があると思います。したがって、プログラミング言語が問題を純粋な関数に分割することを提案する場合、それは機能的です。問題をオブジェクトに分割する必要がある場合は、オブジェクト指向です。「これを実行してから実行する」ことが示唆された場合、それは必須です。したがって、ラムダ、継続などは関数型言語にのみ必要な機能ではなく、JSは関数型と不変データに関して考えることを「示唆」しないため、関数型言語ではありません。
Maciej Piechotka
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.