web-dev-qa-db-ja.com

すべての関数型プログラミングデザインパターンはどこにありますか?

オブジェクト指向プログラミングの資料は、設計パターンでいっぱいです。オブジェクト指向プログラミングに関するほとんどの本は、ファクトリーやデコレーターなどのパターンを設計するために1つまたは2つの章を使用しています。それでは、関数型言語の同等のパターンは何ですか?なぜそれらについての本をまだ誰も書いていないのですか?関数型言語について、デザインパターンを不要にする特別なものはありますか?

76
davidk01

オブジェクト指向と関数型プログラミングは2つの非常に異なるプログラミングパラダイムであり、設計パターン(DP)はOO設計およびプログラミングの重要な部分です。DPは関数型プログラミングではそのような役割を果たしません。

関数型プログラミングではDPは必要ない、と言うことさえできます-DPが解決するかゆみはありません。

  • 設計パターンはプログラミング言語の 欠けている機能 の兆候であると主張することができます。

  • Peter Norvig foundDesign Patterns本の23のパターンのうち16は " 不可視または単純) r "LISPまたはDylan。

  • 「多くのパターンはオブジェクト指向またはより一般的には変更可能な状態を意味するため、データが不変である、またはデータがそのように扱われる関数型プログラミング言語には適用できない場合があります。」 - http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29

52
Maglob

Jeremy Gibbons が本を書いています。それが完了するまでは、彼のブログ Patterns in Functional Programming を読むことができます。彼は自分の投稿を古いものから新しいものへと読むことをお勧めします。

彼の publications も参照してください。彼は Design Patterns as Higher-Order Datatype-Generic Programs で4つのパターンのギャングをカバーし、再帰方程式を使用したプログラミングのパターンについて 折り紙プログラミング (折りたたみと展開)。

68
Corbin March

単純な事実は、多くのOOパターンは関数型言語のイディオム(特に、元のGoFパターン)と見なされることです。たとえば、Iteratorパターン(C#のような言語に組み込まれている)は単にそうではありません。シーケンス演算子を持つLISPまたはMLでは必要です。

O-Oシステムで使用するパターンの多くは、「本質的でないもの」を邪魔にならないようにするためにあり、オブジェクトのコーディングに集中できます。言い換えると、パターンはアプリケーションの重要ではない部分に対するソリューションです。ビジネス価値の追加に集中できるように、パターンを活用して、以前に解決された一般的なニーズに対処する必要があります(データベース送信などを処理するためのエンタープライズアプリケーションアーキテクチャのファウラーパターンのパターン、またはユニットテストを強化するためのxUnitパターンなど)。アプリケーション用。

GoFパターンの詳細を超えて、関数型プログラミングにも適用できる設計パターンがあると確信しています。問題は、O-Oが主要なパラダイムであることです。機能的な開発者を対象としたパターンブックを作成する...率直に言って、出版社からグリーンライトは得られません。それが要約されるものです。機能的パターンのトピックに特化した書籍を多数掲載するには、十分な市場がありません。

13
Michael Brown

スチュアートシエラによるこのトピックについての良い話(〜45分):

http://www.infoq.com/presentations/Clojure-Design-Patterns

必ずしも拘束力があり、権威があるわけではありませんが、データ分析にFPを使用して、自分の経験から彼の多くの例を認識しました。

Clojureで書かれた例ですが、おそらくFP言語に適用できます。彼がカバーするパターンに付けた名前は次のとおりです。

  • 州/イベント
  • 結果
  • アキュムレータ
  • 削減/結合
  • 再帰的拡張
  • パイプライン
  • ラッパー
  • トークン
  • 観察者
  • 戦略
11
Aaron Johnson

あなたが本当にデザインパターンを学ぶことに興味があるなら、Haskellに他ならないでしょう。時間をかけて 言語を難しい方法で学習する 実行すると、基本パターンのほとんどに慣れ親しむことができます-それらは言語に組み込まれています。

モナドをスキップしないでください。世の中には長々とした説明がたくさんあり、アイデアを理解させるにはいくつかのことを行う必要がありますが、プラグインを使い続けると、やがてそれが始まり、デザインパターンの数に驚くことでしょう。この1つの抽象化/インターフェースの上に構築します。

Haskellを手にしたら、FPアーセナルを危険にさらすのに十分な量が手に入ります。ポイントは それを維持する になるまでです。ショートカットはありません。

6
Mario T. Lanza