特にHaskellで、大規模な関数型プログラムを設計/構造化する良い方法は何ですか?
私はたくさんのチュートリアルを行ってきました(Write Yourself a Schemeが私のお気に入りで、Real World Haskellがすぐ近くにあります)-ほとんどのプログラムは比較的小さく、単一目的です。さらに、それらのいくつかは特にエレガントであるとは見なしません(たとえば、WYASの膨大なルックアップテーブル)。
私は今、より多くの可動部分を備えたより大きなプログラムを書きたいと思っています-さまざまなソースからのデータの取得、クリーニング、さまざまな方法での処理、ユーザーインターフェイスでの表示、永続化、ネットワーク経由の通信など。このようなコードを読みやすく、保守しやすく、変化する要件に適応できるようにするための最良の構造はどれですか。
大規模なオブジェクト指向の命令型プログラムに関するこれらの質問に対処する非常に多くの文献があります。MVCやデザインパターンなどのアイデアは、OOスタイルでの関心の分離や再利用性などの幅広い目標を実現するための適切な処方箋です。さらに、新しい命令型言語は「成長するにつれて設計する」スタイルのリファクタリングに役立ちますが、私の初心者の意見では、Haskellはあまり適していないようです。
Haskellに相当する文献はありますか?エキゾチックな制御構造の動物園は、この目的のために関数型プログラミング(モナド、矢印、アプリケーションなど)でどのように利用するのが最適ですか?おすすめのベストプラクティスは何ですか。
ありがとう!
編集(これはドン・スチュワートの回答のフォローアップです):
@donsは言及しました:「モナドはタイプで主要な建築デザインをキャプチャします。」
私の質問は、純粋な関数型言語での主要なアーキテクチャ設計についてどのように考えればよいのでしょうか。
いくつかのデータストリームといくつかの処理ステップの例を考えてみましょう。データストリームのモジュラーパーサーを一連のデータ構造に書き込むことができ、各処理ステップを純粋な関数として実装できます。1つのデータに必要な処理手順は、その値や他のデータによって異なります。一部の手順の後には、GUIの更新やデータベースクエリなどの副作用が伴う必要があります。
データと解析ステップを適切に結び付ける「正しい」方法は何ですか?さまざまなデータ型に対して正しいことを行う大きな関数を書くことができます。または、モナドを使用して、これまでに処理されたものを追跡し、各処理ステップでモナドの状態から次に必要なものをすべて取得することもできます。または、大部分が別個のプログラムを作成してメッセージを送信することもできます(このオプションはあまり好きではありません)。
彼がリンクしたスライドには、「デザインを型/関数/クラス/モナドにマッピングするためのイディオム」という箇条書きが必要です。イディオムとは何ですか?:)