ちょくちょく修正するかも。
4.3.2 Optionの合成 リフト 例外指向のAPIのラッピング
- 通常の関数をリフトすればOptionに対応する関数に出来る(Option[A]の値を操作してOption[B]を返す)
- Try関数(例外ベースのAPIをOptionベースのAPIに変換)
4.4 Eitherデータ型
- SomeやらNoneではエラーが何だったかわからないので、Either型でLeft Rightを使う。Rightが成功ケース、Leftが失敗ケースとして使うのが慣例。
4.5 まとめ
- 例外の問題点
- 純粋関数型のエラー処理の基本原理
- 高階関数を使ってエラーの処理と伝搬に共通するパターン
- 非正格な関数
5 正格と遅延
scala> List(1,2,3,4).map(_ + 10).filter(_ % 2 == 0).map(_ * 3) res0: List[Int] = List(36, 42)
5.1 正格関数と非正格関数
- 非正格性と遅延性 (その引数の1つ以上を評価しないという選択肢が可能 正格関数は引数が常に評価される)
- Scalaの関数定義はすべて正格
- val宣言にlazyキーワードを追加するとlazy val宣言の右辺の評価が最初に参照されるときまで先送り
- 非正格関数は引数を値渡しではなく名前渡し
5.2 遅延リストの例
- 遅延性
5.2.1 ストリームを記憶し、再計算を回避する
- スマートコンストラクタ 追加の不変条件を満たすデータ型 本物のコンストラクタとはシグネチャが少し異なるデータ型を生成する関数
5.2.2 ストリームを検査するためのヘルパー関数
- takeとtoList
5.3 プログラムの記述と評価の切り分け
- FPの主なテーマの一つは関心の分離
- 遅延を利用することで式の記述をその式の評価から切り離す
- メモリをできるだけはやく回収できれば、プログラム全体で必要となるメモリ量を削減できる
5.4 無限ストリームと余再帰
関数は漸進的であるため無限ストリームにも対応
5.5 まとめ
- 非正確性 式の記述をその評価の方法やタイミングから切り離すことでモジュール性を向上させる