Open3
Scala関数型デザイン&プログラミング読書メモ
Goal
Scalaを使って開発することになったので、Scalaの勉強ついでに関数型一般に通づることを勉強する。
第1章: 関数型プログラミングとは
- 副作用の排除
- 作成 vs 処理・解釈 を切り離している
- 依存先が減るのでMock地獄から解放され、Testしやすくなる
- 再利用性が上がる
- 純粋関数 = 副作用を持たない関数
- 参照透過 = 式eがあり、すべてのプログラムpにおいて、pの意味を変えることなくp内のすべてのeをその評価結果で置き換えることができること。(評価結果を置き換えても等価ならOK)
- 上のような特徴から、モジュール性が高い
第2章: Scala関数型プログラミングの準備
- 全ての値をObjectとみなす
- 演算子の概念はない
-
MyModule abs 42
のような中置が可能 - 高階関数
- 末尾再帰でループ
- 再帰呼び出しから戻った後に何もすることがない場合に末尾呼び出しの除去という最適化
- generic
- partial application
第3章: 関数型プログラミングのデータ構造
- 関数型のデータ構造 = immutable
- ex: List
- データ構造も型パラメータ[+A]でPolymorphicに。
- pattern match
- データ型を
sealed trait
で定義し、同じ名前のObject (companion object)に操作Methodsを定義 - データ構造自体はImmutableだが、Insert/Deleteなどはどうすれば? => data sharing こんな感じ
def dropWhile[A](as: List[A], f: A => Boolean): List[A] = as match {
case Nil => Nil
case Cons(x, xs) if f(x) => dropWhile(xs, f)
case _ => as
}
- 高階関数fの型推論:
dropWhile(ls: List[int], (x: Int) => x < 4)
と呼べるが、型パラメータAが最初の引数でBindされるので、x => x<4
でOK。dropWhile(ls)(f)
とカリー化することで、前の情報から順に見ていって型パラメータを推論する。 - リストの再帰と高階関数の一般化: sum, productはfoldRightで一般化できる
2023/03/21 p50まで