なぜ関数型プログラミングは業界でもっと人気がないのですか?今流行ってる?[閉まっている]


61

大学での4年間、私たちはいくつかの関数型プログラミング言語で多くの関数型プログラミングを使用してきました。しかし、私はまた多くのオブジェクト指向プログラミングを使用してきました。実際、自分の小さなプロジェクトを行って最初の仕事を準備するときには、オブジェクト指向言語をより多く使用します。しかし、これらのプロジェクトを行うときは、関数型プログラミング言語でコーディングしたかったことがよくあります。

ただし、仕事を探しているときに、関数型プログラミング言語の知識が必要な仕事を見つけることは非常にまれです。

なぜ関数型プログラミング言語は業界でもっと使われないのですか?最近では関数型プログラミング言語についてかなりのニュースがありますので、関数型プログラミングは今業界で流行しているのでしょうか?


3
ある程度、あなたの質問の前提に同意しません。「関数型言語」に触発された言語機能が、JavaやJavaScriptなどの言語に追加されています。実際、JavaScriptは(ある意味では)常に関数型言語でしたが、最近まで多くの人がJavaScriptに気付いていませんでした。
MatrixFrog

1
@MatrixFrog:「本格的なFP言語を採用する代わりに、非機能言語にいくつかの機能概念を追加することで、機能が半分しか機能しないのはなぜか?」
ジョルジオ

下位互換性、慣性などを含むさまざまな理由で、世界は優れた選択肢に切り替わりません(そして純粋なFPは優れた選択肢です)。DVORAKキーボードレイアウトを検討してください。 qwertyフレンドリーなショートカットを使用します。
KolA

回答:


38

関数型プログラミングがあまり普及していない理由の1つは、知識ベースの不足だと思います。私の経験では、企業はメインストリームではないテクノロジーの実装に関して非常にリスク回避的であり、実証済みの真のフレームワーク(java、c ++、c#)に投資したいと考えています。新しいパラダイムが考慮されるのは、ビジネス上のニーズがある場合(エリクソンなど)に限られます。しかし、エリクソンの場合でさえ、管理者はc ++の使用を要求し、ジョーアームストロングはc ++でアーランコールをコーディングすることを余儀なくされたと聞きました!! これは、企業が新しいテクノロジーを実装することに消極的であることを示しているはずです!


9
関数型プログラミングはどのように「新しい」のですか?
エヴァンプライス

7
彼は「新品」ではなく「未使用」を意味していたと思います。
ビンコヴサロヴィッチ

10
それは未使用です...未使用だからですか?ふむ
アレックスバラノスキー

21
@Alex-まさに。吸いますよね?
キース

5
@ Stargazer712:その理由は何ですか?関数型プログラミングを知らない多くの開発者を知っているので、無知は理にかなっています。関数型プログラミングは、過去に私が気付いていない業界を追い払った大失敗をしましたか?
ショーンマクミラン

67

私は教授でしたが、プログラマと同じように、教授は常に次の大きなものを探しています。彼らが見つけたと思うと、彼らはそれを時流にし、誰もが山積みになります。教授は本当に賢いに違いないと考える学生に説教しているので、それ以外の理由で教授になるのであれば、抵抗はありません。

関数型プログラミングはそのような時流です。確かに、調査すべき興味深い興味深い質問がたくさんあり、興味深い会議の記事がたくさんあります。それは特に新しいアイデアではありません、そしてあなたはちょうどどんな現代の言語でもそれをすることができます、そして、アイデアは面白いために新しいものである必要はありません。持っているのも良いスキルです。

それを考えると、関数型プログラミングは、OOPが唯一のものではないように、矢筒に持つべき1つの矢印であり、唯一のものではありません。

私のコンピュータサイエンスアカデミアの牛肉は、実際に何が現実世界の理にかなっているのか、つまり品質管理を決定するための、産業界との実際的な相互作用の欠如です。その品質管理があった場合、最新の時流だけでなく、トレードオフで問題とそれらの解決策の範囲を分類することに別の重点があるかもしれません。


1
これは本当に良いコメントです。矢筒の矢印、およびトレードオフのあるソリューションの範囲に+1。
user21007

2
QCの場合は+1。その修士課程は、テスト、コードレビュー、コードの複雑さなどをカバーする専任の科目ではるかに有用だったでしょう。プログラムが最後のパッチの後で何をすべきかを自動的に検証できることは、「今すぐ動くはず」の手作業でうんざりするほどの価値があります。
l0b0

5
@ l0b0:ありがとう、実際に教えられていることとその方法の品質管理を考えていました。現状では、CS教授は個人的に最も興味深いと思うものを教えるだけです。それを、現実世界との関連性が非常に高い産業や医療との相互作用があるエンジニアリングと比較してください。IME、CSの教授は、現実の世界は現実の世界で重要なことを教えてくれると考えていますが、学生は学ぶことに熱心ではありません。
マイクダンラベイ

@マイク:現代言語についてはどうですか?C ++とJavaを含めていますか?
ケビンクライン

+1。自分で言ったほうが良かった。
リウォーク

25

最近のソフトウェア開発における最大の問題は、複雑さを管理する能力だからです。これは、ほとんどの関数型プログラミング言語の焦点では​​ありません。そのため、言語ない優先順位(すなわち、より人気のOOP言語)ことを確認だけで、よりアカデミックな関数型言語から出てくるクーラー機能のいくつかを盗み、その上に滞在する傾向があります。


48
同意しません。関数型プログラミング言語は、状態の使用を最小限に抑えようとしますが、それにより複雑さが軽減されます。関数型言語でプログラムされたプログラムは、テストやリファクタリングも簡単です。
ジョナス

7
@Jonas:多くのプログラマーは、状態をほとんど使用しない(自分を含む)プログラムを書くのは非常に難しいと感じています。その観点から、それは実際により複雑です。(私は関数型プログラミングの有用性を決して議論していないことに注意してください!)
ShdNx

3
@ShdNx:はい、知っています。関数型プログラミングは、大学で初めて学んだときは難しいと思いました。しかし、しばらくして、私は命令型プログラミングやより具体的なOOPよりもそれを好み始めました。私の大学では、命令型プログラミングの前に関数型プログラミングが教えられ、大学が命令型プログラミングは最初は非常に難しく、関数型プログラミングは数学に近いと考える前にプログラミングをしなかった学生がいました。
ジョナス

16
難易度と複雑さには違いがあります。OOPは、より多くの概念を追加するため、構造化プログラミングよりも間違いなく困難です。十分な量のコードについては、コードに構造を提供することで複雑さを軽減します。FPも同じです。2行しか記述していない場合はやり過ぎのように見えますが、コードが十分に大きい場合は、ステートレスサブユニットとしてコードを構造化すると、スケーラビリティが向上し、コードの複雑さが軽減されます。
ムハンマドアルカウリ

6
関数型プログラミングの主な強調点の1つは、構成可能性です。それが複雑さを管理するためのツールでない場合、私は何がわからない。
dan_waterworth

23

関数型プログラミングが確実に定着し始めています-ゆっくりですが確実に。

たとえば、私が構築しているスタートアップは、次の理由から、主要な開発言語として関数型言語(Clojure)を使用しています。

  • 生産性 -FPの学習は難しいですが、一度慣れてしまえば、力と表現力の点で勝つことは非常に困難です。私はおそらく、C#やJavaで必要だったものと比較して、特定の機能を実装するための行数の約1/10を書いています。

  • 信頼性 -純粋な関数は、ステートフルオブジェクトよりも推論とテストがはるかに簡単です。したがって、より適切なテストを記述し、コードの正確性をより簡単に検証できます。

  • 並行性-関数型言語は不変性を強調します。不変性は、複数のコアで効果的に実行する必要があるよりも、並行アプリケーションにとって大きな利点があります。好むと好まざるとにかかわらず、複数のコアで実行することは未来です。http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickeyをご覧ください。これがなぜそれほど重要なのかについての簡潔な説明があります。

  • 構成可能性/モジュール性 -関数型言語は、複雑なオブジェクト指向システムよりも簡単にコンポーネントを接続するのに役立つようです。私はまだこれのすべての理由を理解していませんが、その一部は、OOモデルが引きずるすべての「偶発的な複雑さ」を持っていないという事実に由来します。スチュアート・ハロウェイによるラジカル単純性に関する講演では、これらのアイデアをさらに深く掘り下げています。

編集:Despertarのコメントに応えて、モジュール性を制限するOOPシステムの「偶発的な複雑さ」の例は、ディープクローニング対浅いクローニングの問題です。オブジェクトを一緒に構成して、非常にクローニングと突然変異のセマンティクスの慎重な分析。小さなケースではこれは管理可能ですが、複雑なシステムでは急速に重大な問題になります。純粋に機能的なデータ構造に依存している場合、この問題はそもそも存在しません。


+ 1、Clojureを選んだ理由についてのあなたの意思決定プロセスを聞くことに非常に興味があります。(私はClojureに反対ではなく、ただ興味があります)。
dan_waterworth

4
「FPを学ぶのは難しい」:パラダイムを学ぶのは難しい。合理的な生産性を得るのに十分な経験を得るまでに、命令型コード(Pascal)で何時間を費やしたかを覚えています。多くのプログラマーが命令型言語を最初に学び、いったんプログラミングの方法を学ぶと、他の何かを見る時間がないため、FPはあまり知られていないと思います。私はフルタイムのC ++プログラマであり、現在は仕事の後の夜にScalaを学んでいます。面倒を見る家族がいたら、それを忘れることができました。
ジョルジオ

1
最初の3つは素晴らしいケースだと思いますが、4つ目には同意しません。OOPは非常にモジュール式で構成されています。私にとって、これは最大の強みの1つです。また、カプセル化と抽象化により複雑さを隠すのにも優れています。
デスペルター

1
@Giorgio。まさに。「FPを学ぶのは難しい、OOPを学ぶのは簡単」は「スペイン語を学ぶのは難しいが、中国語は簡単」と同じくらいばかげている。どの言語が第一言語であるかによります。また、OOのイディオムは象形文字のようなものであるため、中国語をOOPのarbitrary意的なアナログとして選択しませんでした。1つずつ学習するのは簡単ですが、すべてを覚えるのは難しく、作成するのは不可能です。FPは、アルファベットを使用した言語に非常に似ています。個別の文字は単独では役に立たないが、かなり小さなルールセットで何でも作成できます
KolA

1
(続き)だから、なぜそれが人気がないのか-まだ-同じ理由で。象形文字は、最初のアルファベットが発明され成熟するずっと前から存在していました。アルファベットの書き方と読み方を持っている別の世代が必要な場合があります。最初のパラダイムとしてFPを意味します
KolA

12

キラーアプリの欠如

ねえ、ここの上のこれは新鮮に見えます。(掘る掘る)

ほとんどのプログラミング言語は、「キラーアプリ」を持っていることで繁栄したと思います。これは、その言語に限定された(またはそのように見た)魅力的なものです。これは、すべての受け入れがそのアプリケーションであったと言うことではなく、それが言語をより大きな受け入れへと駆り立てたということです。

以下は、現在ある言語のいくつかを採用するきっかけとなったニッチについての私のあまり正確ではない見解です。

  • C:どこでも動作します(これは70年代後半と80年代後半でした)
  • C ++:GUIフレームワーク(90年代前半)
  • Java:アプレットとサーブレット(90年代後半)
  • Objective-C:iOSアプリ(それ以前のOS Xアプリ)
  • Ruby:Rails
  • C#:ASP.NET、WinForms
  • PHP:Wordpressなど
  • JavaScript:AJAX、特にフレームワーク経由
  • lua:ゲームスクリプティング、特にすごい

それとは別に、多くの専有言語は強力な販売組織(Oracle、およびそれよりも程度は低いがMicrosoftの言語)を通り抜けて、独自のニッチを効果的に生み出しています。

このリストに関する1つの非常に重要な注意:キラーアプリで示されているように、言語の「ニッチ」は、数十年が経過するにつれてますます具体的になります。リストの最後の1つ、具体的にはGame scriptingに注意してください。他の言語によって既に十分に行われていることのリストのために、言語が注目を集めるのはますます難しくなっています。

したがって、関数型言語が実際に離陸する必要があるのはニッチです。実際には、巨大な関数型言語はまだありませんが、小さなニッチにはたくさんあります。

  • Emacs Lisp:開発者によるEmacsの80年代以降の継続的な使用。(他のどこでもほとんど使用されません。)
  • Erlang:多数の同時エージェントが必要な場所。
  • スキーム:教育
  • APL / J / K:ファイナンス(議論のために、これらを関数型と呼びましょう)
  • Common Lisp:「AI」-これは、人々がそれが使われていると言う傾向があるものであり、祝福と呪いです。

さて、この議論から除外したと思う唯一の主要言語はPythonです。Pythonは非常に興味深いことをしました。主要なニッチで勝者とは思えずに成功しました。これ、私がこのように言語の人気を見るのはまったく間違っていることを意味する可能性があります。また、採用と受け入れを促進するキラーアプリがなくても十分に優れた言語普及する可能性がありますが、それは非常に難しく、非常に長い時間がかかる可能性があります。(Perlにも同様の話がありますが、数年前に登場し、現在ではあまり普及していません。)

このことから、私は私が考える機能どの言語と言うことができます増加傾向に:

  • Clojure:Webプログラミング、特に Heroku経由
  • Scala:Lift(最近はPlayかもしれません)-JavaなしのJVM

人気のある関数型言語を次に探す場所を尋ねられたら、ターンキークラウド開発(HerokuまたはGAE)またはターンキーモバイルアプリ開発を備えた関数型言語に目を光らせてください。


Perlも主要な言語だと思います。Unixライクなシステムで最も頻繁に使用されると言うのは古い言語です。Pythonは、より現代的な代替手段のようです。今でも多くの注目を集めており、大きなコミュニティを持つ人気のある言語です。
デスペルター

1
@Despertar-私が言った言語について平等主義になるために特に一生懸命努力したわけではありませんでした:)そして、同意しました。
ジェシーミリカン

1
Perlにいくつかのニッチがありました。最も初期のものは、ドキュメントの古いバージョンに反映されており、「実用的な抽出およびレポート言語」の頭字語として名前を参照していました。第二は、後でビットに沿って来て、CGIスクリプトだった-長年にわたり、perlはしたウェブの言語。明らかに、今ではその人気の多くが失われていますが、元々構築されたのと同じソフトウェアでまだ実行されている古いウェブサイトを見てください、そしてあなたは多くのperlを見るでしょう(私は今slashdot.orgのことを考えています、しかしまだかなりあります)。
ジュール

9

同じ理由で、Lispが実際に流行りませんでした(フレーム戦争を始めましょう!)。関数型プログラミングは、命令型およびオブジェクト指向プログラミングと比較して、非常に異質なパラダイムです。大部分のCS学生のように、Cから始めてC ++ / Javaに進んだ場合、通常の考え方とは完全に直交するような考え方を学ぶことを望まない傾向があります。


2
エイリアンのパラダイム?命令型プログラミングよりも数学に近いです。ここスウェーデンでは、大学のほとんどのCS学生が最初に熱心な関数型プログラミングであると思います。たとえば、C、Erlang、Javaの前に、標準MLから始めました。
ジョナス

4
けっこうだ。英国とインドの多くの工学系学生が最初にCを教えられ、次にC ++やJavaが教えられることを知っています。多くの場合、彼らは関数型言語をまったく教えられません。
チンメイカンチ

14
@Jonas世の中の多くの人々にとって、数学は異質のパラダイムであり、プログラミングを数学からさらに引き離すと理解しやすくなります。
scriptocalypse

5
関数プログラミングはもちろんのこと、卒業したことのない木を聞いたことがない人のことを聞いたことがあります。
dan_waterworth

1
@ Tux-D、実際、いや、私は英国の学生について話している。
dan_waterworth

6

ビジネスとプログラミングについて考えてみましょう。

ソフトウェアを戦略的資産として使用する企業があります。これは典型的ではありません。ほとんどの企業にとって、ITは企業の実際のビジネスをサポートするものです。それは必要な費用です。彼らは、$ Xで必要なITを手に入れることができることを知っているため、保守的です。

さらに、企業では、最も安いことは通常、昨日やったことです。ただし、変更は望ましいことですが、費用がかかります。たとえば、企業がC#/。NETソリューションからF#に変更された場合、問題が発生します。彼らのプログラマー(おそらく最も鋭いプログラマーではない)は、新しい言語を習得し、両方に習熟し、両方を頻繁に使用する必要があります。両方で長い間書かれたルーチンがあるでしょう。Haskellのようなものに移行する場合、または最初にC ++ / MFCを使用している場合、彼らはより多くの変更を行うことになり、それははるかに高価になります。

また、C#プログラマーの供給が予定されており、今後もマイクロソフトのサポートが継続されます。現在のITプラクティスは信頼できます。プログラマーの継続的な可用性の制度的サポートや保証のレベルは同じではありません。

したがって、ほとんどのビジネスでは、関数型プログラミングに変更を加えることは初期費用がかかり、長期的にはITコストの削減が十分である場合にのみ支払われます。


2

あなたはすでに機能的なスタイルでコードを書いていますが、あなたはそれを知りません。

コードの単体テストを作成する必要がある場合、テスト可能な関数を作成する傾向があります。これは、副作用を作成または依存せず、常に同じ引数で同じ結果を返します(いわゆる純粋関数)。これは、機能プログラムの主な利点です。

関数型言語は制限が多すぎると思います。したがって、命令型言語を関数型に置き換える代わりに、命令型言語は関数型の機能を取得します。現在、ほとんどすべてのプログラミング言語にはクロージャーとラムダがあります。


1

あなたの質問に対する本当の答えは1つだけだと思います。この答えが当てはまる理由はたくさんありますが、それらは異なる質問です。

ここにあります:

  • ソフトウェアアーキテクトは、自信を持って機能するソリューションを提供します。
  • アーキテクトの大部分は関数型言語で働いていません。
  • テクノロジーと言語が選択されると、企業はそれらと連携できる人材を見つけます。

流行ってる?それはすべて、関数型言語の使用に自信のある人がアーキテクトになり、作業中のプロジェクトでそれを使用することを選択するかどうかに依存します。


0

本当の問題は状態です。

関数型言語にはグローバルな状態はありません。ほとんどの産業上の問題は、小規模の一部の機能が実際にそれを必要としない場合(元帳の処理)でも、大規模な状態(元帳または一連のトランザクションをどのように表すか)を必要とします。

ただし、本質的にステートフルなVon-Neumanアーキテクチャマシンでコードを実行しています。したがって、私たちは実際に状態を取り除くことはしていません。関数型言語は、状態の複雑さを開発者から隠すだけです。これは、言語/コンパイラが舞台裏の状態を処理し、管理する必要があることを意味します。

したがって、関数型言語にはグローバルな状態はありませんが、それらの状態情報はパラメーターと結果として渡されます。

それでは、言語は感覚の背後にある状態を効率的に処理できるのでしょうか?特に、データサイズがアーキテクチャのサイズをはるかに超える場合。

ハードウェア側から見る

OSは、ここ数年でアドレス空間を視覚化するのに大いに役立ちました。そのため、アプリケーションは公式に心配する必要がありません。ただし、メモリの負荷が激しくなると、心配しないアプリケーションはハードウェアをスラッシングするトラップに陥ります(ハードウェアをスラッシングすると、プロセスのクロール速度が低下します)。

プログラマーは関数型言語の状態を直接制御できないため、これを処理するためにコンパイラーに依存する必要があり、これをうまく処理する関数型言語を見たことはありません。

コインの反対側では、ステートフルプログラマーが状態を直接制御できるため、メモリ不足の状態を補うことができます。私は実際にそうするのに十分賢いプログラマーをあまり見ませんでしたが。

産業側から見ると:

業界には、非効率的なステートフルプログラマがたくさんあります。

しかし、これらのプログラムの改善を長期にわたって測定するのは簡単です。開発者のチームに、プログラムが状態を処理する方法を改善することでコードを改善できる問題を投げかけます。

関数型プログラムの場合、プログラムを改善するツールを改善する必要があるため、改善を測定するのはより困難です(ここでは、プログラムの全体的な改善ではなく、アプリケーションが根本的な状態を効率的に処理する方法を検討しています)。

業界にとっては、コードの改善を測定する能力に帰着すると思います。

雇用の観点から

雇用できるスタットフルプログラマーがたくさんいます。関数型プログラマーを見つけるのは難しいです。したがって、業界が機能的なスタイルのプログラミングに切り替わった場合、基本的な需要と供給のモデルが作動しますが、それは望んでいることではありません(プログラマーはそれなりに高価です)。


2
関数型言語、特に「不純な」関数型言語は、グローバルな状態を完全にうまく処理できます。多くの場合、プログラムは交互の層に分解します。たとえば、グローバルな状態...しかし機能的な状態遷移...これらの遷移のパフォーマンスに重要な部分を実装するために、時々ローカル(マスク)状態で... 命令型言語、IMO の問題機能パターンがより適切に機能する場合、プログラマーが状態を不適切に使用することが多いことです。しかし、言語は両方のスタイルをうまくサポートする方向に進化しているようです。
ライアンカルペッパー

1
関数型言語で状態に対処することは非常に簡単ですが、強調のシフトが必要です。命令型言語では状態を変更するプロシージャを作成しますが、関数型言語では状態を変更するプロシージャを返す関数を作成します。
dan_waterworth

「関数型言語にはグローバル状態はありません」-グローバル状態は必要ありません。ほとんどすべての状態管理はモナドを介して実行できます。
アルナウサニャール

-3

この質問の前提は少し間違っています。次の理由により:

  1. 関数型プログラミングは実際、業界ではかなり一般的です。ただし、経験豊富なプログラマーが利用できる場合にのみ使用されます。初心者はそれを知ることを期待することはできません。ほぼすべての大規模なプログラミングプロジェクトで使用されていますが、経験豊富なプログラマーが扱う領域に保持しています。初心者は、関数型プログラミングを必要としない簡単なモジュールを扱います。
  2. この現実を考えると、人々(通常は大学出身の若い人たち)を雇用している企業は、関数型プログラミングの経験を本当に求めることはできません。関数型プログラミングを必要とするプロジェクトに参加している人は、すでに15年間同じ会社にいます。
  3. 関数型プログラミングの知識が30年後に非常に役立つことをすでに知っているため、大学はそれを教え始めています。彼らの時間範囲は30年であり、企業のような通常の半年ではありません。
  4. これらのポイントは、人々が労働力に就くときに失望し、大学で学んだことは使われないことを見る理由です。しかし、彼らは30年の期間のために設計されており、最終的には有用になるでしょう-それはちょうど企業が人々が知っていると期待できるもの-シンプルなものを使用しているということです。
  5. また、数年の大学卒業後、実際のソフトウェアプロジェクトで機能プログラミングを使用するのに十分な知識があると考えると、you慢になります。最初に単純なものから始めます。作業を開始するときに、最も複雑なソフトウェアを最初のタスクとして実行する必要はありません。最終的には複雑なものに到達しますが、時間がかかります。

2
1)「ほとんどすべての大規模なプログラミングプロジェクトで使用されています」。私の経験では、これは現実とはほど遠いものです。私が知っていることとして関数型プログラミングを使用している企業はほとんどありません。ほとんど唯一のJavaと(C#は、ここ数年より機能的構造を持っているにもかかわらず)のC#、C ++、およびC.使用
ジョナス

2
2)私の経験は反対です。関数型プログラミングを知っているのは大学の人だけだと思われます。ここスウェーデンでは、ほとんどの大学が初年度から関数型プログラミングを教えています。そして、MITのような大学は最近まで、最初のプログラミングコース(Scheme)で関数型プログラミングを使用していました。
ジョナス

@jonas:いいえ、プログラミング言語はそれとは何の関係もありません。もちろん、CとC ++とjavaなどは、多数のプロジェクトで使用されます。関数型プログラミングもC ++コードで機能しています。現在のプラクティスでは、プロジェクトの一部はオブジェクト指向を使用しており、一部は関数型プログラミングを使用しているようです。両方の部分は同じ言語(通常はc / c ++)を使用します
tp1

ええ、Cでもオブジェクト指向を行うことができます。しかし、それはお勧めできません。CおよびC ++は、デフォルトでは不変ではない関数型プログラミングなどのための多くの構造を持っていない、パターンマッチングのための良いサポートは、何が不変のデータ構造のように...含まれていません
ジョナス

それが、経験豊富なプログラマーを必要とする理由です。プログラミング言語を主流の言語から変更することはほとんど不可能なので、次善の策はC ++で関数型プログラミングを行うことです。また、c ++にはconstのようなものがあり、非常に役立ちます。
tp1

-10

FPのデバッグが難しいためです。


11
同意しません。付随的な効果がなければ、デバッグプロセスは簡単です。機能的パラダイムが異なり、デバッグなどの新しい方法に慣れるには経験が必要なので、それは難しいと思うかもしれません。
マニエロ

2
関数型プログラミング言語は、純粋な関数はステートレスであるため、実際にはテストが簡単です。
ジョナス

4
ジョナス、「テスト」とは言わず、「デバッグ」と言いました。あなたが犯した間違いを見つけてください。テストはその一部ですが、プログラムなどについての推論も同様です。これはFPの力の関数です。特定のコード行が多くの作業を行うほど、どのコード行が問題を引き起こしているのかがわかりにくくなります。コード行と効果の間のマッピングは、より拡散的です。単一の高階関数がプログラムの多数の動作に影響を与える可能性があり、その逆も同様です。症状は、同じエラーに対して異なるポイント間で大きく異なる場合があります。
インター

私の経験では、デバッグするのは難しくありません。私はF#を使用していますが、たとえばC#よりもデバッグが難しいと思う理由が見つかりません。怠lazのためにHaskellでデバッグするのは難しいかもしれません(私にはわかりません)が、Jonasが言ったように、熱心なFPプログラミングはステートレスのために簡単です。言い換えると、FPコードは、結果が目に見えない変数の影響を受けないことがわかっているため、より予測可能です。
ムハンマドアルカウリ

2
関数が純粋である限り、デバッグは簡単です。単体テストを追加してデバッグできない場合は、テストを書くのに十分な仕事をしていません。
dan_waterworth
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.