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


25

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

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


5
LINQ?.NETデリゲート?MathematicaのようなDSL?
ジョンハロップ

5
ちなみに、「関数型プログラミング」という用語は、さまざまな人々がさまざまなことを意味するために使用するため、使用している意味を明確にする必要があります。
ジョンハロップ

2
機能コードベースでコーディングする人を見つけることは決してありません。優れたビジネス上の決定ではなく、人材プールを制限します。
パトリックヒューズ

回答:


52

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


19
絶対に。純粋な関数型プログラミングは、非常に状態指向のアプリケーションにはあまり適していません。これが、両方を行えるハイブリッド言語が好きな理由です。機能的問題には機能的パラダイムを、命令的問題には命令的パラダイムを使用します。
マットオレニック

8
同意した!状態はプログラミングの重要な部分です。これが、Haskell、いくつかの点で最も純粋なFP言語でも状態とIOの使用を許可する理由です-それは単にIOコード/可変状態コードと純粋なコードの区別を強制します。 。
ビル

8
だから私はHaskellが大好きです。これらのステートフルコードを最小限に抑えることをお勧めします。OOでは、再利用可能で理解しやすく、テストしやすいコードを書くことを目指しています。ほとんどの場合、私はコードで終わるようになりますが、Haskellではそれほど違いはありません。
レニープログラマー

4
「単にIOコード/可変状態コードと純粋なコードの区別を強制するだけで、テストには非常に便利です」。型システムを回避したり、モナドクリープを導入したりせずに、デバッグメッセージを出力することさえできません。
ジョンハロップ

2
おそらく、純粋な関数プログラムは、それを実行することで世界をまったく変えないでしょうか?
マーティンベケット

24

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

問題は、非常に頭が良い(ときどき素晴らしい)にもかかわらず、あまりにも多くの人々が、純粋さ、完璧さ、そして自分自身の(しばしばかなり狭い)世界観の強制と、言語とそれを使用するすべての人。

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

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

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

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


4
機能言語が多ければ、機能言語間のクロスオーバーが増えるかもしれません。
バリーブラウン

5
あなたはその純粋さなしでは「機能的」ではありえません。行をまたぐと、コンセプト全体がバラバラになり、最終的には面倒で並列的な標準言語になりますが、利点はありません。
パトリックヒューズ

7
あなたの最初の問題は、関数型言語がお互いに有利になるほど違いがないことであり、あなたの2番目の問題は、それらが簡単に行き来できないほど異なることです。
ティコンジャービス

2
私にとって、この答えは暴言のようです。例を挙げれば、あなたの議論はもっと説得力があるでしょう。
ベンジャミンホジソン

1
...roughly 10,000 languages and dialects that are enough different to annoy but only rarely enough different for one to have a truly significant advantage over the others...いいえ、それはこれらの手続き言語のすべてのように聞こえます。Java、Scala、Kotlin、C ++、C#、Groovy、Cheddar、ES6、Ceylon、Pythonなど、リストは延々と続きます-これらはすべて、実際の問題を解決しないCの退屈な繰り返しです。それはこの保証の答えを補完する私の保証意見です:D
cat

17

関数型プログラミングがあまり広く使われていない理由は、それがあなたの邪魔になりすぎるからだと思います。たとえば、LispやHaskellを「この言語全体が1つの大きな抽象化の反転である」と言わずに真剣に調べることは困難です。必要なときにコーダーが取得できないベースラインの抽象化を確立するとき、言語では単純にできないことを確立し、言語がより機能的であるほど、これらが多くなる傾向があります。

たとえば、Haskellを考えてみましょう。機能的純度という名のもとに、状態とI / Oを管理するために、誰も理解していない脳を破壊する抽象化の反転を使用する必要があります それは速く老化します。


9
+1、ただし、高レベルの命令型言語でプログラミングするとき、同じように感じることがあります。たとえば、なぜfsckでは、Cのように関数ポインターを使用するだけでなく、Javaで単一のメソッドインターフェイスを実装する単一のメソッドクラスを作成する必要があるのでしょうか。
dsimcha

14
私はそれがあなたがそれらの抽象化を「下に入れることができない」ということではなく、単に多くの作業を要するということです。私たちはバナナを拾い、命令的な言語で食べることに慣れています。Haskell(たとえば)は、見ていなかったときにバナナが不思議なことに食べられないという保証を優先しているため、最初に20ページのフォームに記入します。これは、バナナについて推論するときに役立ちますが、時々空腹です。
j_random_hacker

4
@dsimcha:これはJavaの特異性であり、高レベルの命令型言語の傾向ではありません。実際、高レベル言語は、おそらく関数をファーストクラスのオブジェクトとして持つ可能性が高いでしょう。
ムハンマドアルカウーリ

3
Haskellでのモナドの必要性は、機能的な純度ではなく、副作用と怠zyな評価が相性の悪い2つの素晴らしいフレーバーであるという事実に起因しています。モナドは逐次評価を強制します。(本当に、それらは計算ビルダーまたは何かと呼ばれるべきです。「モナド」はカテゴリ理論家以外の誰にとってもお粗末な名前です。)そして、あなたはモナドなしで(意図的に使用して)FPを喜んで行うことができます!
フランクシェラー

4
注意すべき点が1つあります。これらの「抽象化の反転」を考えると、言語はより制限される可能性がありますが、コンパイラとランタイムはコードについてより多くの保証があり、さらに多くのことができます。これはガベージコレクションのようなものです.gc言語では、mallocスペース(これは便利かもしれません)だけではできませんが、その代わりに、ランタイムはすべてのメモリを手動で管理するよりも効率的に管理できます。機能的な純度も同じです。
ティコンジャービス

8

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


4
これは論理的に有効なポイントですが、OPの質問の最後の文に「頻繁に発生するプログラミングの問題のために」を追加することで解決できます。(個々の読者が自分が何であるかを説明する限り、さまざまな問題に遭遇することは問題ではありません。)
j_random_hacker

4

たとえそれを習得したとしても、広く理解されていないという単純な理由で商用製品に関数型言語を使用することに気が進まない可能性があります。時間をかけて維持または拡張すること。

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


2

市場投入までの時間

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


1
多くの場合、機能プログラムはテストが簡単です。そして、彼らは短いです。同意しません。「関数型プログラミングへの切り替えに対するあなたの最も強い意見は何ですか?」という別の質問に答えると思います。
ジョナス


2

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

私がfpに対して有意義な議論をするなら、haskellのような深刻な関数型言語を学ぶことはフォーミュラ1の車を運転することを学ぶことに似ているでしょう... 、あなたの同僚はカムリを運転していて、喜んでそうしています。fpに優しい環境で仕事を見つけることは依然として非常に困難であり、自力で努力したり、fpの有名な実務家を探したりしない限り、この変化は見られません。

私の答えは私をfp fanboyとして見せてくれると思います。haskellのような実際のfp言語を真剣に試すことをお勧めします。


6
あなたの最初のパラグラフは、FPマインドセットの何が悪いのかを正確に説明していると思います。「状態がコードに与える影響を評価する興味深い新しい方法」は必要ありませ。それは一体何の意味ですか?!?実際に物事
メイソンウィーラー

2
Camry Iドライブには問題がありますが、スペースの漏れがないかどうかを常に確認する必要はありません。Haskellは、F1車のように見える言語にていますが、実際には、長期間にわたって高回転を行うことはできません。:-P
j_random_hacker

1
@Mason Wheeler:「コードに対する状態の影響を評価するための興味深い新しい方法は望ましくありません。」代わりに、望ましくない副作用による非常に厄介なバグの追跡に1週間を費やすことを好みます(私は個人的な経験から話しています)。
ジョルジオ

@brad clawsie:FPで副作用を制御する問題全体がコーディングの生産性を高めるのに役立つと思います:書くのに時間がかかりますが、修正するのに時間がかかりません。残念ながら、最初は学習にかなりの努力を払わなければならず、多くのプログラマーはこの長期的な思考を持っていません。最初に正しく行う時間はありませんが、後でデバッグして修正する時間は常にあります。:
ジョルジオ

@Mason Wheeler:機能的な観点から、共有状態を持つことは最適化の目的にのみ役立ちます。値のコピーには時間とメモリがかかりすぎるので、不要なコピーを避けるためにデータオブジェクトを共有します。ただし、共有状態を最初から強制することは、一種の時期尚早な最適化です。
ジョルジオ

2

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

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

  • スクリプト言語を使用してプログラミングすると、生産性が向上します。
    状況によっては、pythonやrubyなどのスクリプト言語を使用すると、生産性が向上する場合があります。これは、さまざまなパッケージまたはライブラリを高速プロトタイピングおよび接着することを意味しています。このコンテキストでは、動的言語(動的オブジェクト指向プログラミングなど)を使用することもできます。通常、静的型付けの方が優れていますが、動的型を使用したスクリプトを作成すると、プラスの効果が得られます。

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

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

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


3
「習得しやすい」:Haskellをマスターすることは、現代のC ++をマスターすることほど難しくないと思います。私たちはよく知らないことを一生懸命に考えがちだと思います。
ジョルジオ

1

FPは便利なパラダイムとしては反対していませんが、プログラミング言語で利用できる唯一のパラダイムとしては反対しています。

多くの問題を解決するのに利点があります。ただし、FPはCなどの手続き型言語に適用できます。


最初の文に同意し、2番目の文に同意しません。基本的に、ガベージコレクションなしでFPを実行することはできません。
-dsimcha

「プロシージャル」ラベルに適合するために、言語のランタイムシステムに透過的なメモリ管理(ガベージコレクション)がないという要件はないため、2番目の文をそのように言い表すのは皮肉です。BASICはそのような言語の1つです。
Huperniketes

「基本的にガベージコレクションなしではFPを実行できません。」- なぜ?
quant_dev

+1最も基本的なレベルでの関数型プログラミングは、ステートレスプログラミングです。これをある程度できない言語はないと思います。C、C ++、Java、アセンブリ、C#、さらにはBasicで関数を作成しました。必要なのは、関数に副作用がないこと、または呼び出し間で状態を保持しないことだけです。
マイケルK

一方、言語が完全に純粋な場合、コンパイラは最適化により多くの余裕があります。また、コードのテストと推論が容易になります。全体で機能的であることはないハイブリッドなアプローチを超えるいくつかの利点を与えます。とにかくコードの大部分をステートレスにする場合は、もう少し進んで追加のメリットを享受することもできます。
ティコンジャービス

1
  1. (そして最も重要なこと)プログラマーの労働力はそれらの言語やスタイルで訓練されていません
  2. 機能的エバンジェリストの多くは、機能的販売を試みているため、a-holesまたはfruitcakesとして出てきます。a-holeが好きな人はいませんし、フルーツケーキの後ろにお金を投げる人もいません。心を込めて、私は本当に機能的なものが好きで、それを引き込みたいと思っていますが、私は職場でトレーニングにお金をかけずに開発することができる唯一の人であることを知っています(ハードセル)、そしてほとんどすべての良い読者の話を参考にする。

数百のコアがあり、ロックがスケールしないという認識に達すると、機能するようになります。次に、ネストされたデータパラレルが「ビッグアイロン」プログラムに進む唯一の方法になり、機能的に優れています。


0

FPは、パフォーマンスを無視しながら素敵な短いプログラムを書くのがクールだからです。現実の世界では、これに対する陰謀はありません。また、たとえば、いくつかの要素(たとえば、基数の並べ替え)を実装すると、FPの全体的な痛みのように見えます。ああ、生成されたコードはIMHExperience sloooooooooooooooooooowです。


4
ええ、それは特許的には真実ではありません。Haskellコードは通常CやJavaと同等であり、Pythonや友人よりもはるかに高速です。また、通常、並列化は簡単であり、潜在的にさらに高速になります。
ティコンジェルビス

0

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

関数型プログラミング(JavaからClojureに移行)を開始しましたが、それでもかなり難しいと感じています。コミュニティは、Javaほど表現力のあるコードを作成していないようです。

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


FPはMathに近いため、プログラミングの経験がない人は、OOPの学習曲線はFPよりも急勾配であると言うでしょう。「コミュニティはJavaほど表現力のあるコードを書いていないようです」とはどういう意味かわかりませんが、あなたのポイントは何ですか?
ジョナス

関数型言語が表現力を失うことは聞いたことがありません。しかし、その後、Javaよりも表現力の低い言語も使用したことがないため、「表現力のある」定義が異なる場合があります。
グレナトロン

@Jonas-1つの簡単なことのために:関数、変数などの名前のショートカット...つまり、単に、それらが何をするのか、またはすることになっているかの名前を付けないのですか?なぜ「pmap」なのか?
ベラン

1
@Belun:関数型プログラミングとは関係ありません。特定のプログラミング言語を参照する必要があります。マップは多くの関数型プログラミング言語で一般的な関数であり、良い名前を持っています。pmapあなたが言及するのは、パラレルのバリアントかもしれません。
ジョナス

「コミュニティは書いていないようだ」と言った。それは私が経験したことであり、私が見たコミュニティに関係しているということです。私はそれを疑いますが、すべてに適用する必要はありません。それは関数型プログラミングとしなければならない、それはそのスタイルのようだ
Belun

0

関数型プログラミング言語の経験はほとんどありませんが(HaskellとLispを知っています)、FPパラダイムは非常に強力で、他のパラダイムよりもエレガントであることが多いと思います。FPを使用して本格的なプロジェクトに取り組む機会があればいいのにと思います。

FPの有効性に関して深刻な疑念を抱いている唯一の領域は、誘導的に定義できない複雑なデータ構造(グラフなど)をどのように処理できるかです。たとえば、大きなグラフで動作するアルゴリズムを実装しなければならない場合、おそらくグラフを歩いて小さなローカル変更を行うと、FPアプローチはプログラムがノードからポインターを使用するノード。

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