web-dev-qa-db-ja.com

関数型プログラミングに対するあなたの最も強い意見は何ですか?

関数型プログラミング は、最も古いプログラミングパラダイムの1つです。ただし、より一般的なパラダイムと比較して、業界ではあまり使用されていません。しかし、それは主に学界で強調されてきました。

関数型プログラミングに対するあなたの最も強い意見は何ですか?

25
Jonas

問題は、最も一般的なコードが本質的に状態(ビジネスアプリ、ゲーム、UIなど)に関係していることです。アプリのsome部分が純粋に機能していることには問題はありません。実際、ほとんどのアプリは少なくとも1つの領域でメリットを得ることができます。しかし、あちこちにパラダイムを強制することは、直感に反します。

関数型プログラミングの問題は関数型プログラミング自体ではありません。それを行うのはほとんどの人であり、それを行うための言語を設計するのはほとんどの人が(さらに悪いことです)です。

問題は、非常に賢い(時には実に見事な)にもかかわらず、あまりに多くの人々が純粋さ、完璧さについて熱狂的すぎて、自分の(しばしばかなり狭い)世界観を強制し、言語とそれを使用するすべての人。

結果の1つは、妥協の失敗です。これにより、(とりわけ)約10,000の言語と方言が得られます。これらの言語と方言は、煩わしいほど十分に異なりますが、他の言語よりも本当に重要な利点を得るには十分に異なるものです。多くの人は現実の世界も見て、機能モデルにうまく適合しないため、基本的には間違いであり、無視するのが最善であると判断します。

妥協できないことで、特定の種類の問題(またはいくつかの特定の種類の問題)に対しては非常に美しいが、実際にはsuckが他の多くの言語にとって非常に美しい言語がいくつかあります。その一部はおそらく機能モデル自体によって引き起こされますが、もっと多くのことは(少なくとも私には)、この領域に引き付けられている基本的な性格タイプによって引き起こされているようです。

これは多くの問題を引き起こします。まず第一に、「関数型プログラミング」を学ぶことは、ほとんどの場合哲学的価値があります。他のほとんどのタイプの言語では、特定のジャンルの1つの言語を知ることは、別の言語を学ぶ上で非常に役立ちます。プロジェクトで言語Xを使用している場合、通常、言語Y(Xは知らない)をかなり安全に知っている人を雇うことができます。関数型言語では、それはそれほど真実ではありません。あなたはErlangをよく知っているかもしれませんが、それでもHaskellのモナドは完全に異質で理解できないものです。

言語の数とそれらの間の才能の限られた移植性を組み合わせると、醜い状況になります。1つの言語または方言がそれを合理的に一般的な使用にするために必要な「クリティカルマス」を形成することはほとんど不可能です。それはゆっくりと変化していますが、それでもLinuxが主流のデスクトップOSになっているようです-毎年、人々は最終的にこれはthe年になるという説得力のある議論を思いつきます-そして、今何十年もの間毎年毎年予測している人々のように、彼らは再び間違っているでしょう。それはそれが(どちらか一方が)決して起こり得ないということではありません-予測を見て「いや、今年ではない」と考える人々が今まで正しかった人々であったというだけです。

24
Jerry Coffin

関数型プログラミングがあまり使われないのは、それが邪魔になりすぎるからだと思います。 「この言語全体が1つの大きな抽象反転である」と言わずに、LISPやHaskellなどを真剣に検討することは困難です。必要なときにコーダーが下に置くことができないベースラインの抽象化を確立すると、言語が単純に実行できないことを確立し、言語がより機能的であるほど、言語が持つ傾向が強くなります。

たとえば、Haskellを取り上げます。機能の純粋性の名の下に、状態とI/Oを管理するために、誰も理解していない、画期的な抽象反転を使用する必要があります何かと相互作用するすべてのコンピュータープログラムの2つの最も基本的な部分!それは早く古くなります。

17
Mason Wheeler

すべての敬意をもって、私はあなたの質問が間違っていると思います。関数型プログラミングは、ツール、または特定の種類の問題を解決するのに役立つ一連のツールです。それについての意見を持つことは、特定の問題またはアプリケーションのコンテキストでのみ意味があります。一般的にそれに対する意見を持つことは、ペンチやレンチに対する意見を持つことに似ています。

8
Dima

私はそれをマスターしたとしても、広く理解されていないという単純な理由から、商用製品に関数型言語を使用することに消極的である可能性があります。ビジネスの成長が予想される場合、他の開発者を見つけることができるか心配です。時間の経過とともにそれを維持または拡張します。

それは考えられないことではなく、実際のハッキングスキルを持たないjavaschool gradはそのタイプのプロジェクトのどこから始めればよいかわからないため、おそらくより高いレベルの開発者になるでしょうが、有能な開発者の限られたプールは確かに必要な考慮事項ですビジネスの観点から。

4
glenatron

製品化までの時間

手続き型コードとマントラの完全なITランドスケープを取り除くのは困難です。

2
Jé Queue

まず第一に、私はステートフルプログラミングとfpに関する引数を一切受け入れません。 HaskellでStateモナドを調べてください。コードに対する状態の影響を評価するための興味深い新しい方法が多数見つかります。

私がfpに対して有意義な議論をしたとしたら、haskellのような深刻な関数型言語を学ぶことは、フォーミュラ1の車を運転することを学ぶようなものです... 、あなたの同僚はカムリを運転していて、そうすることは非常に満足しています。 fpフレンドリーな環境で仕事を見つけることは依然として非常に困難です。自分でストライキをしたり、fpの有名な実践者を探したりしない限り、この変化は見られません。

私の答えは私をfpファンボーイとして表示すると思います。 Haskellのような本当のfp言語を使うことをお勧めします。そうすべきでない理由を見つける前に、真剣に考えてみてください。

2
Brad Clawsie

私は関数型プログラミングの大ファンであり、擁護者です。しかし、ここに私のポイントがあります:

  • 習得が容易
    pythonおよびRuby(および他の多くの言語))のようなプログラミング言語は簡単に学ぶことができます。Haskell、Agdaなどの言語を使用した高度な関数型プログラミング、Coq、ATSなどは習得が非常に困難です。「数学的構造化プログラミング」という用語を使用する人もいます。カテゴリー理論と抽象数学に精通している場合は簡単ですが、たとえば何かの手掛かりがない場合は、かなりの作業になります。モナド」です。

  • スクリプト言語でプログラミングすると、生産性が向上する可能性があります。
    python and Ruby=のようなスクリプト言語を使用している状況では、生産性が向上する可能性があります。これは、異なるパッケージやライブラリをすばやくプロトタイピングして接着することを意味します。 。動的言語(たとえば、動的オブジェクト指向プログラミング)を使用することも、この状況では良いことです。通常、静的型付けの方が優れていますが、動的型を使用したスクリプトを実行すると効果があります。

  • ビジネス上の考慮事項
    プログラミングは、成功したソフトウェアプロジェクトのごく一部にすぎません。ソフトウェアは機能しなければならず、ユーザーは満足している必要があり、これは必ずしも使用されているプログラミング言語に依存しているわけではありません。管理者は、新しいテクノロジーとプログラミング言語を評価する際に、メリットとリスクを考慮する必要があります。新しいプログラマーは新しいプログラミング言語をすぐに習得できますか?会社でこのテクノロジーを使用した経験はありますか?リスクはありますか?これは上級管理職と議論するのが難しいでしょうか?

ビジネスのコンテキストでは、関数型プログラミングは、コアソフトウェアコンポーネント(ミッションクリティカルではないコンポーネントなど)に追加されるシステムで使用できます。たとえば、コアソフトウェアをほとんど変更せず、新しいプログラミング言語で新しい部品(GUI、監視ソフトウェアなど)を追加する銀行。 (例外もあるかもしれませんが、これは銀行での私の経験です。)

さらに、関数型プログラミングは、正式な検証がメリットまたは必須である場合に非常に役立ちます。

2
mrsteve

有用なパラダイムとしてFPに反対しているわけではありませんが、プログラミング言語で利用可能な唯一のパラダイムであることには反対しています。

それは多くの問題を解決する上で利点を提供します。ただし、FPはCのような手続き型言語で適用でき、適用されています。

1
Huperniketes
  1. (そして最も重要なことですが)プログラマーの労働力はそれらの言語やスタイルで訓練されていません
  2. 機能的な伝道者の多くは、機能的な販売方法を模索しているため、穴やフルーツケーキとして脱落しています。誰もaホールが好きではありませんし、フルーツケーキの後ろにお金を投げるつもりもありません。心の中で、私は本当に機能的なものが好きで、それを取り入れたいと思っていますが、私は職場で、トレーニング(ハードセール)にお金をかけずに開発できる唯一の人だと知っています。読者のトークダウンを参照。

何百ものコアがあり、ロックがスケーリングしないという認識に達したときに、機能が実現します。その場合、ネストされたデータの並列処理が「ビッグアイアン」プログラムを実行する唯一の方法となり、機能はその点で優れています。

1
anon

FPは、パフォーマンスを無視しながら、ニースの短いプログラムを書くのがクールであるため、学界ではクールです。現実の世界ではそれに対する陰謀はありません。また、たとえば、いくつかのもの(たとえば、基数ソート)の実装は、FPでの完全な苦痛のようです。ああ、生成されたコードはIMHExperience sloooooooooooooooooooowです。

0
NoSenseEtAl

関数型プログラミング言語の経験はほとんどありませんが(一部のHaskellとLISPは知っています)、FPパラダイムは非常に強力で、他のパラダイムよりもエレガントであることが多いです。仕事をする機会があったらいいのにと思います。 FPを使用する深刻なプロジェクト。

FPの有効性に関して深刻な疑いがある唯一の分野は、グラフなどの帰納的に定義できない複雑なデータ構造をどのように処理できるかということです。たとえば、大きなグラフで動作するアルゴリズムを実装し、おそらくグラフをウォークして小さなローカル変更を行う場合、FPアプローチは、プログラムの移動が許可されている命令的アプローチと一致できるかどうか疑問に思いますポインタを使用してノードからノードへ。

0
Giorgio

学習曲線が非常に急で、時間がかかるものもあります(特にOOPから来た場合は、パラダイムシフトを行う前に数回頭をくすぐります)。

関数型プログラミング(Javaから来てClojureに行く)を始めましたが、それでもかなり難しいと思います。コミュニティはJavaほど表現力豊かなコードを書いていないようです。

表現力の小さな損失と複雑さの小さな増加があるようです。

0
Belun