随時更新。
関数型デザインとコンビネータライブラリ
- Part I では、関数型プログラミングの基礎を取り上げ、純粋関数にこだわることが、ループ、データ構造、例外といったプログラムの構成要素にどのような影響を与えるのか
- Part II では、関数型プログラミングの前提がライブラリの設計にどのような影響を与えるのか
- 関数型の設計はやっかいで繰り返し
- 設計上の選択に関して疑問が生じた場合は、自分にとって納得のいく方法で結論を引き出す
- 関数型ライブラリの設計に正しい答えはありません
7 純粋関数型の並列処理
- ライブラリの簡単なユースケース
- ユースケースのためのインターフェイス開発
- ドメインと設計空間への理解
- 代数的推論 (algebraic reasoning)
- 法則 (law)
- API
7.1 データ型と関数の選択
- 設計を進めるにあたって難しいのは、そうしたアイデアを練り直し、必要な機能を可能にするデータ型を見つけること
- 畳み込みの代わりに分割統治アルゴリズムを使う
- サンプルによって明らかとなる理想の API を設計し、そこから実装に向かって逆方向に作業
scala> Examples.sum(IndexedSeq(1,2,3)) res3: Int = 6
単純な例の重要性
- 整数の合計は、実際にやってみると非常に高速なので、並列化によってかえってオーバーヘッドが増える
- 関数型の設計では、特殊なケースを山ほど示すのではなく、単純で合成可能な、基本的なデータ型と関数を構築していくことにより、表現力を鍛えることを目指す
7.1.1 並列計算のためのデータ型
設計プロセス全体が、小さな冒険の連続
- 単純な例をすばやく作成
- 設計上の選択肢の洗い出し
- 1つのオプションの興味深い結果
並列化プリミティブを直接使用する場合の問題点
- 意味のある値を返さない
- 副作用
以上から、関数型プログラムから直接使用したくなるようなモジュール性と合成性を備えた APIたりえない。