関数型プログラミングがよく合わない一般的な問題は何ですか?[閉まっている]


22

関数型プログラミングは宣言的なパラダイムです。FPの長所の1つは、副作用が回避されることです。いくつかの問題では、FPは適切ではないと言われています。

関数型プログラミングが適合しない一般的な問題は何ですか?


ふう!しばらくの間、「パラダイムに欠陥がある」と言ったと思います。それから私は戻ってチェックしました。
マークC

1
副作用は回避されるよりも(とにかくHaskellで)分離されていると言う方が正確だと思います。モナドでは状態の変更が許可されており、モナドには「状態」という名前が付けられています。
ラリーコールマン

Larry Colemanが説明したように、関数型プログラミングが副作用を回避するのは事実ではありませんが、それらの使用を妨げ、一部の言語ではそれらを明確に分離します。たとえば、research.microsoft.com
en

回答:


17

本質的に非常にステートフルなアプリケーション。ビデオゲームは実世界をモデル化しているため、良い例です。何かが変化するたびに以前の状態から再構築するのではなく、世界の状態を変更することを考える方がはるかに理にかなっています。

具体的な例は、怪物が撃たれた後に怪物の健康状態を変えることです。単にヘルスを変更するほうが、ヘルスが低下したことを除いて、あらゆる点で同じ完全に新しいモンスターに置き換えるよりもはるかに賢明です。これらの種類の変更は、ゲームの世界のほぼすべてを構成し、純粋に機能的な方法でこれを行うことはあまり直感的ではありません。少なくとも純粋に関数型言語で実行している場合は、パフォーマンスに重大なペナルティが生じる可能性があると思います。

(補足として、ゲームの問題の中には、AIなどの関数型プログラミングに非常に適しているものもあります。ハイブリッド関数/命令型言語は、これらの場合に最適です。)


9
記事The Next Mainstream Programming Languages:A Game Developer's Perspectiveは、純粋に機能的な動作がデフォルトであり、状態の変化がバグを回避するために型によって追跡される、特にゲーム開発向けのplを主張しています。そのため、関数型パラダイムがゲームプログラミングに本質的に不適切であると誰もが信じているわけではありません。
sepp2k

1
@ sepp2k、リンクをありがとう。本物のゲームを作った人から議論された視点を見てうれしいです。
マットオレニック

3
@ sepp2k待って、何か見逃しましたか?プレゼンテーションをより詳しく読んだ後、Sweeneyはほとんどのコアエンジンを純粋に機能的なコードで記述し、ほとんどのゲームロジックを命令的に記述(または少なくとも許可)し、STMを使用して同時実行を支援するように主張していたようです。これは私にとって非常に合理的です。
マットオレニック

@Matt:いいえ、そうです、彼はゲームのロジック部分に可変状態が含まれると言います。ただし、言語が型(「musings」セクションで提案している)を通じて可変性を追跡することを妨げるものではありません。もちろん、「型による状態の追跡」は「機能的」ではないため、以前のコメントを楽観的に言いすぎていたかもしれません。
sepp2k

@ sepp2k右、私はあなたの意味を参照してください。
マットオレニック

17

リアルタイムの組み込みプログラミングはすべて副作用です。デジタルおよびアナログIO、タイマー、シリアルおよびパラレルポートとのやり取り、興味深いことはすべて、副作用を伴う関数を呼び出すことによって行われます。


3
さて、あなたが単にハードウェアインターフェイスを意味するのであれば、C / C ++以外のものは良い選択だとは思いません。ただし、Erlangのような言語の上にあるレイヤーでは、特にテレコムシステムで使用されることがあります。Erlangは、クリティカルでフォールトトレラントな組み込みリアルタイムシステム用に設計された関数型言語です。
ジョナス

@Jonas:Erlangは突然変異を最小限に抑えるかもしれませんが、もちろん副作用であるメッセージを渡すためにIOに大きく依存しています。
ジョンハロップ

11

GUIプログラミングは、関数型プログラミングには適していないと思います。GUIは一般に非常にステートフルであり、副作用なしで使用するよりも状態を使用してモデリング/管理する方がはるかに簡単です。GUIに関数型プログラミング言語を使用することは確かに可能ですが、おそらくそれは良い考えではありません。

別の回答で述べたように、ゲームは状態を追跡することで管理が容易になることが多く、関数型言語でゲームを書くことはできます、「ステートフル」言語(つまり、オブジェクト指向の言語)言語)。


-1:純粋さについて話し、一流の関数の使用を無視しています。たとえば、GUIコードでのコールバックは、OOP言語よりも不純なFP言語の方がはるかに簡単です。
ジョンハロップ

4
@Jon Harrop:一流の関数は関数型プログラミング言語に固有のものではありません。私はまだ、FPスタイルはGUIに適していないと主張しています。
ミパディ

1
誰に頼るかによります。ほとんどの関数型プログラマにとって、ファーストクラス関数は関数型プログラミングのまさに定義です。
ジョンハロップ

@Jon Harrop:ほとんどの関数型プログラマーは、関数型プログラミングはプログラムを数学関数の構成と評価として記述する方法だと言うでしょう。一流の関数はこのパラダイムの重要な部分ですが、一流の関数だけでは関数型プログラミング言語(または関数型プログラム)を作成しません。関数型プログラミングのパラダイムは、状態および可変データ構造の使用を最小限に抑えるよう努めており、FP言語がこのスタイルを奨励することさえありません。FPが...それはファーストクラスの機能のような個々の特徴であるとして、プログラミングのスタイルについて多くようで、そして
mipadi

...このパラダイムがGUIプログラミングに特に適しているとは思いません。一般的に言えば、オブジェクト指向言語はGUIにより適しています。
ミパディ

5

データ駆動型ビジネスアプリケーション。ユーザーインターフェイスと単純なデータ操作には、FPは必要ありません。


2
そして他のデータ/ビューアプリケーション、本当に。ゲームの大部分は状態とその変更に関するものであるため、機能的なスタイルにうまく変換しないでください。
ジョンパーディ

18
本当に?FPはこれに特に適しているといつも思っていました。これらのアプリがデータの選択、集計、および投影を行うものの99%とは異なりますか?それは基本的にfilterreduceそしてmapです。一部で投げsortpartitiongroupBy。結局のところ、そのようなアプリケーションを作成するために最も広く使用されているプログラミング言語、関数型言語であるExcel です。
ヨルグWミットタグ

3
データ駆動型のビジネスアプリケーションと単純なデータ操作を備えたアプリケーションは、FPに非常に適しているように聞こえます。例えば、参照ウォール街での冒険FA機能プログラマ
ジョナス

1
-1:FPが優れているアプリケーションをリストしました。
ジョンハロップ

2

関数型プログラミング自体には適さない問題セットを簡単に却下することはできません。

関数型プログラミングに使用される実際の言語とその機能に大きく依存します。

1つの例は、リアルタイム組み込みシステム用の既述のErlangです。

ステートフルネスは、関数型プログラミングに対する優れた基準でもありません。これに対処するために、関数型プログラミング言語で実装されたいくつかの成功した方法があります。

関数型プログラミングに対する副作用もしばしば言及されています。完全に独創的ではないすべてのプログラムには、副作用があります。したがって、現実世界のすべてのFP言語には、これに対処する方法がありますが、それは世界の副作用をいかにエレガントにカプセル化するかだけです。

グローバル変数のような任意の副作用はまったく必要ありません。

しかし、問題をよく見かける方法をひねらないため、関数型プログラミングを簡単に行えるようにする問題セットがあります。しかし、ひとたび機能的に考えるようになれば、より多くの問題がより少ない副作用に開かれます。

Cをプログラミングする場合でも、グローバル変数などの任意の副作用を可能な限り減らすことは常に良い考えです。


GUIアプリケーションなどのステートフルアプリケーションは、実際には機能的な方法で実行するのが難しいのですか、それとも推奨事項がありますか?
ジョナス

何らかの種類のプロセス/スレッドの抽象化がある場合(Erlangなど)、プロセス内で状態を渡すことができます。
ピアストリッツィンガー

3
GUIアプリケーションは通常、イベントループを中心に構築されます。関数型言語でイベントループをかなりうまく書くことができます。より複雑な場合は、おそらくバックグラウンド処理用のスレッド/プロセスをいくつか追加します。しかし、何らかの種類のプロセス/スレッドの抽象化(Erlangなど)がある場合は、プロセス内で簡単に状態を渡すことができます。継続も役に立つかもしれません。GUIのハンドルを取得するための機能的な方法で物事を行うことに慣れていると思います。GUIプログラミングが今日難しいと考えられている理由の1つは、ほとんどのツールキットが機能的な使用を目的としていないことです。
ピアストリツィンガー

1
@Jonas:Haskellでは、IOモナド、Stateモナド、または組み合わせを使用します。
ラリーコールマン

1
@Jonas:それはあなたの有用な定義に依存します。ウィキブックの例ではwxHaskellを使用していますが、Real World Haskellではgtk2hsを使用しています。私のHaskellアプリはコマンドラインベースであるため、どちらも試していません。
ラリーコールマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.