なぜ関数型言語なのか?[閉まっている]


332

ここで関数型言語などについて多くの話をします。なぜあなたは「伝統的な」言語でそれを使うのですか?彼らは何をよりよくするのですか?彼らは何が悪いのですか?理想的な関数型プログラミングアプリケーションは何ですか?


John Hughesがこれについて論文を書いています:関数型プログラミングが重要である理由
Hjulle

回答:


214

関数型言語は、命令型およびオブジェクト指向言語とは異なるパラダイムを使用します。これらは、言語の基本的なビルディングブロックとして副作用のない関数を使用します。これにより、多くのことが可能になり、多くのことがより困難になります(または、ほとんどの場合、人々が慣れているものとは異なります)。

関数型プログラミングの最大の利点の1つは、副作用のない関数の実行順序が重要ではないことです。たとえば、Erlangでは、これは非常に透過的な方法で並行性を有効にするために使用されます。また、関数型言語の関数は数学関数と非常によく似ているため、関数型言語に簡単に変換できます。これにより、コードが読みやすくなる場合があります。

従来、関数型プログラミングの大きな欠点の1つは、副作用がないことでもありました。IOなしで有用なソフトウェアを作成することは非常に困難ですが、IOを関数に副作用なしで実装することは困難です。そのため、ほとんどの人は、単一の入力から単一の出力を計算する以上に関数型プログラミングを使いこなすことはありません。F#やScalaなどの最新の混合パラダイム言語では、これはより簡単です。

現代の言語の多くは、関数型プログラミング言語の要素を持っています。C#3.0には多くの関数型プログラミング機能があり、Pythonでも関数型プログラミングを実行できます。関数型プログラミングの人気の理由は、主に次の2つの理由にあると思います。マルチプロセッサコンピューターがますます増えるため、通常のプログラミングでは同時実行性が実際の問題になりつつあります。そして言語はよりアクセスしやすくなっています。


14
あなたはPythonで関数型プログラミングをすることができますが、それは本当にひどいです。stackoverflow.com/questions/1017621/…–
Gordon Gustafson、

28
それはだではない純粋な関数型言語でのIOコードを記述するのは難しいです。これらはすべて、命令型言語と同じように機能するIOコードを記述するためのシンプルなメカニズムを提供します。彼らはすべてがある強制あなたがインターフェイスIOを行わないと宣言されている他のコード内のIOコードを呼び出すことができません。類推は、Javaのような静的に型付けされた言語がメソッドから希望する型を返すのを困難にしたと文句を言う動的言語プログラマーです。
ベン

9
Haskellは純粋な関数型言語の例であり、あなたが言った欠点はありません。副作用はカプセル化されているため、実際には副作用の処理がはるかに簡単になり、プログラマーは命令型言語よりもはるかに強力な抽象化レベルを実現できます...実際、誰もがHaskellを試して、実際に理解し、理解する必要がありますなぜこれほど強力なのか。
FtheBuilder 2016年

202

「キャッチオン」プログラミングの関数型アプローチについては、40年もの間(プログラミングのスタイルとして)使用されているので、疑問の余地はないと思います。OOプログラマーが不変オブジェクトを支持するクリーンなコードを書くときはいつでも、そのコードは機能的な概念を借用しています。

ただし、関数型スタイルを強制する言語は、最近多くの仮想インクを取得しており、それらの言語が将来的に支配的になるかどうかは未解決の問題です。私自身の疑いは、ScalaOCamlなどのハイブリッドのマルチパラダイム言語が 、純粋なOO言語(Smalltalk、Betaなど)がメインストリームプログラミングに影響を与えたが、終わらないのと同じ方法で、「純粋な」関数型言語よりも支配的になる可能性が高いことです。最も広く使用されている表記法として。

最後に、FPに関するコメントは、手続きプログラマーから何年も前に聞いたことのない発言と非常に類似していることを指摘しておきます。

  • (神話的な、私見の)「平均的な」プログラマーはそれを理解していません。
  • それは広く教えられていません。
  • それを使用して作成できるプログラムは、現在の手法を使用して別の方法で作成できます。

グラフィカルユーザーインターフェイスと「ビジネスのモデルとしてのコード」がOOをより広く評価するのに役立つ概念であったのと同様に、不変性とシンプルな(大規模な)並列処理の使用の増加は、機能的アプローチが提供する利点をより多くのプログラマーが理解するのに役立つと思います。しかし、デジタルコンピュータープログラミングの歴史全体を構成する過去50年ほどの間に学んだことと同じくらい、私たちにはまだ学ぶべきことがたくさんあると思います。今から20年後、プログラマーは、現在人気のあるOO言語やFP言語など、現在使用しているツールの原始的な性質に驚きを振り返ります。


55
ちょうど20年前を見てください。プログラミングがそれほど進化したわけではありません。より良いツールがあります。おそらく新しい言語または2つですが、基本的にはほとんど変更されません。これには20年以上かかります。2000年には空飛ぶ車が見られると思っていました。:)
bibac 2009年

32
O'Camlはアイルランド人ですが。
defmeta 2009年

7
@alexの奇妙さ:オブジェクト指向のプログラミング学校でも命令型プログラミングの学校でも、「お気に入りの不変性」と「副作用を回避する」は長い間優れた経験則でした。(それで何が
嫌い

101
@bibac:20年前、私たちはCコードを書いていて、ClipperやTurbo Pascalのメリットについて議論していました。オブジェクト指向は、学者の唯一の領域でした。少しも変わったことを提案するのは全くばかげています。
ダニエルC.ソブラル

24
@ダニエル:クリッパーの「メリット」を主張した人々のリストを提供してください。彼らは追い詰められ、裁判にかけられる必要があります。
デビッド

125

私にとっての主な利点は、特により多くのMHzから離れてより多くのコアに向かっている今、その固有の並列処理です。

私はそれが次のプログラミングパラダイムになり、OOタイプのメソッドを完全に置き換えるとは思わないが、関数型言語でコードの一部を記述する必要があるか、汎用言語がより機能的な構造を含むように成長します。


4
私たちはすでにこれが起こっているのを見ています。そして、それは将来さらに発生するでしょう。したがって、私はこの点について100%同意します。
Jason Baker、

トリッキーなことは、並列処理に非常に適しているのは、FPの何も共有されていない/副作用がないということです。そして、これらはOOソリューションではうまく機能しない側面です。効果的なハイブリッドを作成することは非常に困難です。おそらく、OOノード間のFP接着剤ですか?
ジェームズブレイディ

効果的なハイブリッドについては、Dプログラミング言語の2.0ブランチをご覧ください。アルファ版/進行中の作業ですが、実現中です。
dsimcha 2009年

2
私はこの答えを興味深いと思いました。関数型言語は知りませんが、なぜ並列処理に適しているのですか?
andandandand 2009年

26
共有データがないため、関数には副作用がありません。気になるのは戻り値だけです。(これは、オブジェクト指向/手続き型プログラマが頭を悩ますのはかなり難しい考えです。)したがって、ある関数の出力が別の関数の入力として使用されない限り、一度に多くの関数を呼び出すことができます。
トム・スミス

79

専門的に関数型言語で作業したことがなくても、関数型プログラミングを理解することで、より優れた開発者になります。それはあなたのコードとプログラミング一般に新しい視点を与えます。

私はそれを学ばない理由はないと言います。

関数型と命令型のスタイルをうまく組み合わせた言語が最も興味深く、成功する可能性が最も高いと思います。


良い点ですが、「どのようにしてあなたはより良い開発者になるのですか」の説明を見たいです
-mt3

20
異なるプログラミングパラダイムは、異なる角度から問題にアプローチし、多くの場合、「異なる考え方」または考え方を必要とします。そして、さまざまな考え方で自分を訓練する(どの状況でどの方法を使用するかを学ぶことを意味する...)ことは決して悪いことではありません。
peSHIr 2009

56

私は常にネクストビッグシングに懐疑的です。多くの場合、Next Big Thingは歴史の偶然であり、テクノロジーが優れているかどうかに関係なく、適切な場所に適切なタイミングで存在します。例:C ++、Tcl / Tk、Perl。すべての欠陥のあるテクノロジーは、その日の問題を解決するか、または定着した標準とほぼ同じであるか、またはその両方であると認識されたため、すべて非常に成功しています。関数型プログラミングは確かに素晴らしいかもしれませんが、それが採用されるという意味ではありません。

しかし、私人々が関数型プログラミングに興奮している理由お伝えします。多くのプログラマーは、関数型言語を使用することで、生産中に2倍(またはおそらく10倍)生産性が高まるという一種の「変換経験」を経験しました。変更に対する耐性が高く、バグが少ないコード。これらの人々は、関数型プログラミングを秘密兵器と考えています。この考え方の良い例は、ポールグラハムのBeating the Averagesです。ああ、彼のアプリケーション?eコマースWebアプリ。

2006年の初めから、関数型プログラミングと並列処理についても話題になっています。Simon Peyton Jonesのような人々は少なくとも1984年以来、並列処理の心配を繰り返してきたので、関数型言語がマルチコアの問題を解決するまで、私は息を止めません。しかし、それは今のところ追加の話題のいくつかを説明しています。

一般に、アメリカの大学は関数型プログラミングを教える仕事をしている。Schemeを使用てイントロプログラミングを教えるための強力なサポートの中核があり、Haskellもそこでサポートを楽しんでいますが、関数型プログラマーに高度なテクニックを教える方法はほとんどありません。私はハーバードでそのようなコースを教えました、そして今春タフツで再びそうします。ベンジャミン・ピアスはペンでそのようなコースを教えてきました。ポール・フダックがイェール大学で何かをしたかどうか私は知りません。ヨーロッパの大学はずっと良い仕事をしています。たとえば、関数型プログラミングはデンマーク、オランダ、スウェーデン、英国の重要な場所で強調されています。オーストラレーシアで何が起こっているのか、私にはあまり意識がありません。


英国の大学については知りません。ここにある多くの大学がプログラミング言語をほとんど教えていないことに気付くでしょう(幸運ならJava、C、おそらくPerl)。ここでの問題は、最高の(いくつかの)大学が最高のCSプログラムを持っているため、品質の違いです。
Mike B

あなたが挙げた例は欠陥がある、ニッチかもしれない、または特定の領域に適しているが、大規模な学習曲線なしに普遍的に取り上げられるのに十分な一般的な目的には同意しません。それがおそらく彼らがとても成功している最大の理由です。
gbjbaanb 2009年

私は...英国(だけでなく、パスカル、C、Modula2およびCOBOL)でユニでフォースとLispましたが、20年前のその
kpollock

29
私はuni(オーストラリア)でJava / C ++を教えられましたが、同僚の何人かはHaskellでいくつかのユニットを作っている別の大学に行きました。プログラミング入門と最終年度の単元の両方で使用されました。初めてキャスティングを紹介された後、同僚がJava講師に言った話を聞いて笑いました(この時点で彼はHaskellしか知りませんでした)-「何か?!トンKNOWはそれが何であるかを入力します!」
Jacob Stanley、

1
チーム内のすべてのヨーロッパ人でC#に何が起こったのかを見てみ
ましょう

32

ここの部屋で象について言及している人はいないので、それは私次第だと思います:)

JavaScriptは関数型言語です。特にjQuery、Dojo、およびその他のフレームワークの細かい点を活用して、JSでより高度なことを行う人が増えるにつれて、FPはWeb開発者のバックドアによって導入されます。

クロージャーと組み合わせることで、FPはJSコードを本当に軽量にしますが、それでも読み取り可能です。

乾杯、PS


2
それが私が実際に関数型プログラミングを掘り始めた方法です。Prototype.jsのlist.Each(function(item){})またはjQueryの操作方法全体に勝るものはありません。
コリーR.キング

20
Javascriptを使用すると、機能的な方法でプログラミングできます。ただし、これはクロスパラダイム言語であり、さまざまな方法でプログラミングできます(私は好きですが、それは関係ありません)... OO、関数型、手続き型など
RHSeeger 2009年


jQueryオブジェクトのメソッドは、リストモナドの単なる操作です。コンテナー(またはシーケンス)を表すオブジェクトを入力として受け取り、オブジェクトコンテナーを出力として返すことは、fmapの実用的な再発明の良い例です。
Jared Updike、2011年

25

ほとんどのアプリケーションは、通常のオブジェクト指向の方法で解決できるほど単純です

  1. オブジェクト指向の方法は、常に「正常」であるとは限りませんでした。この10年間の基準は、過去10年間に取り残された概念でした。

  2. 関数型プログラミングは数学です。LispのPaul GrahamLispの代替関数型プログラミング):

したがって、この1950年代の言語が時代遅れではない理由を簡単に説明すると、それはテクノロジーではなく数学であり、数学は古くならないということです。Lispと比較する正しいことは1950年代のハードウェアではありませんが、たとえば、1960年に発見され、現在でも最速の汎用ソートであるQuicksortアルゴリズムです。


25

あなたが関数型プログラミングであることを知らなかったと思います:

  • Excelの数式
  • クォーツコンポーザー
  • JavaScript
  • ロゴ(亀のグラフィック)
  • LINQ
  • SQL
  • Underscore.js(またはLodash)、D3

10
JavaScriptは関数型プログラミングとどのように考えられていますか?
パセリエ2014年

8
ファーストクラスの関数、高階関数、クロージャー、匿名関数、部分的なアプリケーション、カリー化、構成があります。
daniel1426 2014年

2
はは。ネストされた関数を使用した画面よりも幅が広いロード返済Excel式を書いたら。私は関数型プログラミングをしていることを知っていましたが、まだその用語を知りませんでした。
ProfK 2014年

7
そのリストにCを追加してください
Mandeep Janjua

2
@MandeepJanjua:えっ?どうして?または、なぜどの言語もないのですか?
Sz。

18

平均的な企業のプログラマー、例えば私が一緒に働くほとんどの人はそれを理解しておらず、ほとんどの作業環境はあなたがそれをプログラムすることを許可していません

それは時間の問題です。あなたの平均的な企業のプログラマーは、現在のビッグシングが何であれ学習します。15年前、彼らはOOPを理解していませんでした。 IF FPは、あなたの「平均的な企業のプログラマは」続く、上のキャッチ。

大学で実際に教えられているわけではありません(または、最近ではそうですか)。

さまざまです。私の大学では、SMLは学生が紹介される最初の言語です。MITはLISPを1年目のコースとして教えていると思います。もちろん、これら2つの例は代表的なものではないかもしれませんが、ほとんどの大学では、FPに関するオプションのコースを提供しています。

ほとんどのアプリケーションは、通常のオブジェクト指向の方法で解決できるほど単純です

しかし、それは実際には「十分に単純」の問題ではありません。ソリューションはFP でよりシンプル(またはより読みやすく、堅牢でエレガント、高性能)になりますか?多くのことは「Javaで解決するのに十分単純」ですが、それでもなお膨大な量のコードが必要です。

いずれにせよ、FPの支持者たちは、これが数十年前から次の大物であると主張していることを覚えておいてください。おそらく正しいのかもしれませんが、5、10、または15年前に同じ主張をしたときはそうではなかったことに留意してください。

しかし、C#が最近注目している点の1つは、最近では、気づかれることなく、世代のプログラマーをFPプログラマーに実質的に変えようとしているという点で、FPに向けて急激に変化していることです。それはFPの「革命」への道を開くかもしれない。多分。;)


MITは、使用もちろんそのイントロCSでスキームを教えるために、それは今のPythonを使用しています。
ミパディ2009年

1
「15年前、彼らはOOPを理解していなかった」-問題は、15年前、彼らもFPを理解していなかったことです。そして、彼らは今日もそうではありません。
Jason Baker、

15

人間は、他の芸術の価値を見ることができない場合、選択した芸術の完全性と不完全性を理解できません。以下のルールは、技術のある時点までの開発のみを許可し、学生とアーティストはさらに学び、さらに追求する必要があります。戦略の芸術だけでなく、他の芸術を学ぶことは理にかなっています。

他の人の活動を見て自分自身についてもっと何かを学んでいない人はいますか?剣を学ぶためにギターを勉強します。こぶし研究商取引を学ぶために。剣を勉強するだけでは、心が狭くなり、外に向かって成長することができなくなります。

-宮本武蔵「五指輪の書」


12

関数型言語の重要な特徴の1つは、ファーストクラスの関数の概念です。考え方としては、関数をパラメーターとして他の関数に渡し、それらを値として返すことができます。

関数型プログラミングでは、状態を変更しないコードを記述します。これを行う主な理由は、関数を連続して呼び出しても同じ結果が得られるようにするためです。関数型コードは、ファーストクラスの関数をサポートする任意の言語で作成できますが、Haskellのように、状態を変更できない言語もあります。実際、副作用(テキストの印刷など)を行う必要はまったくありません。まったく役に立たないように思えます。

Haskellは代わりにIOへの別のアプローチを採用しています:モナド。これらは、インタプリタのトップレベルによって実行される必要なIO操作を含むオブジェクトです。その他のレベルでは、それらはシステム内の単なるオブジェクトです。

関数型プログラミングにはどのような利点がありますか?関数型プログラミングでは、各コンポーネントが完全に分離されているため、バグの可能性が少ないコーディングが可能です。また、再帰関数とファーストクラスの関数を使用すると、コードの構造を通常反映する正確さの簡単な証明が可能になります。


12

私は、関数型プログラミングが(OOのような主要なパラダイムになる)とは思えない、最も現実的な人々は考えていないと思います。結局のところ、ほとんどのビジネスの問題はかなり数学の問題ではなく、データを移動してさまざまな方法で表示するための非常に重要なルールです。つまり、純粋な関数型プログラミングパラダイムには適していません(モナドの学習曲線はオブジェクト指向をはるかに超えています)。

OTOH、関数型プログラミングはプログラミングを楽しくするものです。宇宙の根底にある数学の簡潔な表現の本質的で時代を超越した美しさを認めてくれます。人々は関数型プログラミングを学ぶことはあなたをより良いプログラマーにするだろうと言っています。これはもちろん非常に主観的です。個人的にはそれも完全に正しいとは思いません。

それはあなたをより良い知性のある存在にします。


6
OOはFPよりも本質的に簡単だとは思いません。それは本当にあなたの背景に依存します(私は数学の男です、私がはるかに簡単だと思いますか?:) OOオブジェクトとあなたの非常識なルールをくそー。
temp2290 2009年

14
モナドは理解するのが難しくありません。その強気には買わないでください。
レイン、

-1 OOPは難しいFPよりもある
ちょうど誰か

-1 FPがかなり数学の問題にのみ適している場合、OCamlまたはHaskellを使用して最適化コンパイラーを作成しません。
gracchus

8

私は密であるにちがいありませんが、それでもまだわかりません。F#などの関数型言語で記述された小さなアプリの実際の例はありますか?ソースコードを見て、そのようなアプローチを使用する方が、たとえばC#よりも優れている理由と方法を確認できますか?


良い発言+1。@メンデルト:「よりアクセスしやすい」?コードを見ると頭痛が早いということですか?
Patrick Honorez

2
このF#ライブラリを参照してください:quanttec.com/fparsec/tutorial.html。同じ命令にコンパイルされたとしても、F#コードの半分のエレガントで読みやすいパーサーを備えたサンプルコードをC#で見たいと思います。そして、FParsecをF#からC#に移植してみて、コードが膨張する様子を確認してください。
Jared Updike、2011年

8

関数型言語についてあなたが言ったすべてのことを指摘しますが、ほとんどの人は約20年前にオブジェクト指向言語について言っていました。その当時、OOについて聞くのは非常に一般的でした。

* The average corporate programmer, e.g. most of the people I work with, will not understand it and most work environments will not let you program in it
* It's not really taught at universities (or is it nowadays?)
* Most applications are simple enough to be solved in normal IMPERATIVE ways

変化はどこかから来る必要があります。以前のテクノロジーで訓練を受けた人々が、変更は不要であるとの見方をするかどうかに関係なく、意味のある重要な変更が行われます。OOへの変更は当時反対していたすべての人々にもかかわらず良いと思いますか?


2
*平均的な企業のプログラマー、たとえば私が一緒に働くほとんどの人はそれを理解できず、ほとんどの作業環境ではプログラムできません-それは私が働いた多くの場所でのOOPに当てはまります:)(もちろん彼らは言う彼らはOOPを行っていますが、行っていません)
tolanj

7

F#は、Microsoftが推進しているため、追いつくことができます。

プロ:

  • F#はVisual Studioの次のバージョンの一部になります
  • Microsoftはしばらくの間コミュニティを構築しています-著名な顧客と協力するエバンジェリスト、書籍、コンサルタント、MSカンファレンスでの重要な露出。
  • F#はファーストクラスの.Net言語であり、これは本当に大きな基盤を備えた最初の関数型言語です(Lisp、Haskell、Erlang、Scala、OCamlには多くのライブラリがないとは言いませんが、.Netほど完全ではありません)です)
  • 並列処理の強力なサポート

反対:

  • F#は、C#と.Netに長けていても、開始するのが非常に難しい-少なくとも私にとっては:(
  • おそらく良いF#開発者を見つけるのは難しいでしょう

それで、私はF#が重要になるために50:50のチャンスを与えます。他の関数型言語は近い将来には実現しないでしょう。


6
ScalaはJREのかなり深い基盤だったと私は主張します。
cdmckay 2009

2
ライブラリに関しては、それはあなたが何をしているかに本当に依存します。F#は金融セクターをターゲットにしており、科学計算にも適用できますが、OCamlは実際には.NETよりもそのようなアプリケーション用のはるかに優れたライブラリを備えています。たとえば、OCamlからF#に来たとき、まともなFFTを見つけることができず、自分でC#を記述してからF#を記述(および販売)しました。
Jon Harrop

1
LINQはC#で機能的な概念を使用して良い橋で、VB.Net ...そして、私はそれがF#と比較して読み取ることがはるかに少ない苦痛であることがわかりました
マシュー白く塗った

5

言語が受け入れられるかどうかの最も重要な部分は、その言語がどれほど優れているかだと感じる人いるためだと思います。残念ながら、物事がそれほど単純なことはめったにありません。たとえば、私は、Pythonの受け入れの背後にある最大の要因は言語自体ではないことを主張します(それかなり重要ですが)。Pythonが非常に人気がある最大の理由は、その巨大な標準ライブラリとサードパーティライブラリのさらに大きなコミュニティです。

ClojureやF#などの言語は、JVM / CLRに基づいて構築されていることを考えると、このルールの例外となる場合があります。結果として、私には彼らに対する答えがありません。


+1が、マーケティングの力を忘れないでください、そしてあなたの会社のレガシーコードの山がいくつかのクールな新しいトレンドのおかげで言語を切り替えるつもりはないという事実。
temp2290 2009年

そして、あなたは言及するのを忘れていました:グーグルはPythonを普及させています。
Hao Wooi Lim

4

ほとんどのアプリケーションは、[ここに好きな言語、パラダイムなどを挿入する]で解決できます。

これは事実ですが、さまざまなツールを使用してさまざまな問題を解決できます。ファンクショナルは、正しく使用すると仕事をより効果的に実行できるようにする、別の高(より高い?)レベルの抽象化を可能にします。


4

LispやSchemeを学部生として学んだことのない人々が、今ではそれを発見しているように思えます。この分野の多くのことと同様に、誇大宣伝を行い、高い期待を生み出す傾向があります...

合格します。

関数型プログラミングは素晴らしいです。しかし、それは世界を引き継ぐことはありません。C、C ++、Java、C#などはまだ存在します。

これから来るのは、言語を超えた能力だと思います。たとえば、関数型言語で物事を実装し、他の言語でそのものにアクセスできるようにするなどです。


1
C#は、(Lispと同じように)関数型プログラミング言語になりました。これは、C#に第一級の字句クロージャがあるためです。実際、それらはWPFとTPLで既に使用されています。そのため、関数型プログラミングは明らかにすでにここにあります。
Jon Harrop、


3

物事はしばらく機能的な方向に動いています。過去数年の2人のクールな新しい子供たち、RubyとPythonはどちらも、以前よりも関数型言語に根本的に近づいています。そのため、一部のLispersはどちらか一方を「十分に近い」ものとしてサポートし始めています。

そして、超並列ハードウェアがすべての人に進化のプレッシャーをかけていること、そして変更に対処するのに最適な場所にある関数型言語であることから、HaskellまたはF#が次の大きなものになると考えるのはかつての飛躍ではありません。


3

最近、プログラミング言語の進化を追っていますか?すべての主流のプログラミング言語のすべての新しいリリースは、関数型プログラミングからますます多くの機能を借りているようです。

  • クロージャー、無名関数、値としての関数の受け渡しと戻りは、LispとMLハッカーだけが知っているエキゾチックな機能でした。しかし徐々に、C#、Delphi、Python、Perl、Javascriptがクロージャーのサポートを追加しました。将来の言語が閉鎖なしで真剣に受け取られることは不可能です。

  • いくつかの言語、特にPython、C#、Rubyは、リスト内包表記とリストジェネレーターをネイティブでサポートしています。

  • MLは1973年にジェネリックプログラミングを開拓しましたが、ジェネリックのサポート(「パラメトリックポリモーフィズム」)は、過去5年ほどで業界標準になりました。私の記憶が正しければ、Fortranは2003年にジェネリックをサポートし、続いてJava 2004、C#は2005年、Delphiは2008年にサポートしました。 。)

これらの機能がプログラマにとって魅力的な理由は何ですか?それは明らかに明白であるべきです:それはプログラマーがより短いコードを書くのを助けます。将来のすべての言語は、競争力を維持したい場合、少なくともクロージャをサポートする予定です。この点で、関数型プログラミングはすでに主流になっています。

ほとんどのアプリケーションは、通常のオブジェクト指向の方法で解決できるほど単純です

単純なものにも関数型プログラミングを使用できないと誰が言うのですか?すべての関数型プログラムがコンパイラ、定理証明器、または超並列通信スイッチである必要はありません。より複雑なプロジェクトに加えて、アドホックな使い捨てスクリプトにF#を定期的に使用しています。



3

リンクが開かない。エラー403.
Alexey Frunze

これは良い代替品でしょうか?cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf
canadiancreed

リンク切れ。これが、これらの種類の回答が引用やリンクに不利である理由です。
Sylwester、2014

リンクを修正しました。@Sylwesterは本当ですが、23ページのドキュメントです。このサイトで答えを出すために紙を蒸留しても、それは正義ではありません。
グロム2014

2

最初の点には同意しますが、時代は変わります。企業は、たとえ採用が遅れていても、有利な点があると判断すれば対応します。人生はダイナミックです。

彼らは90年代後半にスタンフォード大学でHaskellとMLを教えていました。カーネギーメロン、MIT、スタンフォード、その他の優れた学校のような場所が生徒にそれを提示していると確信しています。

ほとんどの「Web上のリレーショナルデータベースを公開する」アプリは、その流れの中で長く続くことに同意します。Java EE、.NET、RoR、およびPHPは、その問題に対するかなり優れたソリューションを進化させてきました。

重要な何かにぶつかりました:関数型プログラミングを後押しする他の方法では簡単に解決できない問題である可能性があります。それは何でしょうか?

大規模なマルチコアハードウェアとクラウドコンピューティングはそれらを推進しますか?


2

FPには生産性、信頼性、保守性の面で大きなメリットがあるためです。メニーコアは、大量のレガシーコードにもかかわらず、大企業が最終的に切り替えを行うキラーアプリである可能性があります。同時実行性や並列処理には適していません。

「通常の」プログラマーが理解できないことに同意しません。彼らは、最終的にOOPを理解したのと同じように(これは、不可解で奇妙なことですが、そうでない場合も同様です)。

また、ほとんどの大学がFPを教えています。多くの大学がFPを最初のプログラミングコースとして教えています。


申し訳ありませんが、FPはOOPの約3倍です。これは単にもっと時間を必要とする問題ではありません。FPが主流になるには、もう少し時間がかかります。
Jason Baker、

「何かもっと」がメニーコアになる可能性があると私が説明する私の投稿の部分をどのように見逃すことができますか?そして、「周りにある」ものはあまり関係ありません。人々がOOPを理解したのは、その時点で具体的なメリットがあったためですが、FPはごく最近実用化されました。
セバスチャン

2

うわー-これは興味深い議論です。これについての私自身の考え:

FPは、一部のタスクを比較的単純にします(FPなしの言語と比較して)。FP以外の言語はすでにFPからアイデアを取り入れ始めているので、この傾向は今後も続き、FPへの移行を容易にするのに役立つマージがさらに増えると思います。


2

うまくいくかどうかはわかりませんが、私の調査によると、関数型言語はほぼ間違いなく学ぶ価値があり、より優れたプログラマーになります。参照の透明性を理解するだけで、多くの設計上の決定が非常に簡単になり、結果として得られるプログラムの推論がはるかに容易になります。基本的に、問題が発生した場合、何百ものクラス/メソッド/関数によって引き起こされた可能性のある、一貫性のない状態の問題ではなく、単一の関数の出力のみの問題になる傾向があります。副作用のある命令型の言語で。

FPのステートレスな性質は、Webのステートレスな性質により自然に対応するため、関数型言語は、よりエレガントでRESTFULなWebアプリケーションに簡単に対応できます。アプリケーションの状態を維持するためにVIEWSTATEやSESSIONキーのようなひどく醜いハックに頼る必要があるJAVAや.NETフレームワークとは対照的です。

また、アプリケーションがステートレスになるほど、並列処理が容易になります。あなたのウェブサイトがたまたま人気になった場合、ウェブにとって非常に重要です。パフォーマンスを向上させるためにサイトにハードウェアを追加するだけでは、必ずしも簡単ではありません。


2

私の見解では、Microsoftがそれをさらに主流に押し上げたので、それは今流行るでしょう。私にとってそれは魅力的です。私たちにとって何ができるのか、それは新しい挑戦であり、将来のために憤慨する仕事の機会があるからです。

習得したら、プログラマーとしての生産性をさらに高めるための別のツールになります。


2

議論で見逃した点は、最良の型システムが現代のFP言語で見つかることです。さらに、コンパイラはすべての(または少なくともほとんどの)型を自動的に推測できます。

興味深いのは、Javaのプログラミング時に型名を書くのに半分の時間を費やしていることですが、Javaは型安全ではありません。Haskellプログラムでタイプを書くことは決してないかもしれませんが(コンパイラーがチェックする一種のドキュメントを除いて)、コードは100%タイプセーフです。


1

他の答えに加えて、純粋な関数の形でソリューションをキャストすると、問題をよりよく理解するように強制されます。逆に、機能的なスタイルで考えると、問題解決能力が向上します*。

*機能的パラダイムの方が優れているため、または追加の迎え角が得られるためです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.