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