Open6

『関数型プログラミングの基礎 JavaScriptを使って学ぶ』を読む

ピン留めされたアイテム
takuuuuuuu777takuuuuuuu777

目次

  1. 第I部 関数型プログラミングの基礎
    1. 第1章 「計算」とは
      1.1. 「計算」のモデル
      1.2. 命令型モデル
      1.3. 関数型モデル
    2. 第2章 なぜ関数型プログラミングが重要か
      2.1. プログラミング言語における関数の特徴
      2.2. 関数型プログラミングの特徴
      2.3. 関数型プログラミングの利点
  2. 第II部 JavaScriptによる関数型プログラミングの実践
    1. 第3章 心の準備
      3.1. DRY原則
      3.2. 抽象化への指向
      3.3. セマンティクスを意識する
      3.4. テストに親しむ
      3.5. JavaScriptと関数型プログラミング
    2. 第4章 データの種類と特徴
      4.1 型とは何か
      4.2 基本型
      4.3 合成型
      4.4 変数とデータの関係
      4.5 参照透過性の仕組み
    3. 第5章 プログラムをコントロールする仕組み
      5.1 条件分岐の種類と特徴
      5.2 反復処理の種類と特徴
      5.3 再帰による反復処理
    4. 第6章 関数を利用する
      6.1 関数の基本
      6.2 関数と参照透過性
    5. 第7章 高階関数を活用する
      7.1 高階関数とは何か
      7.2 カリー化で関数を返す
      7.3 コンビネータで関数を組み合わせる
      7.4 クロージャーを使う
      7.5 関数を渡す
      7.6 モナドを作る
    6. 第8章 関数型言語を作る
      8.1 プログラミング言語の仕組み
      8.2 抽象構文木を作る
      8.3 環境を作る
      8.4 評価器を作る
  3. 第Ⅲ部 付録
    1. 第9章 JavaScript環境を準備する
      9.1 実行環境を準備する
      9.2 テスト環境を準備する
takuuuuuuu777takuuuuuuu777

第1章 「計算」とは

1.1. 「計算」のモデル
1.2. 命令型モデル
1.3. 関数型モデル

1.1. 「計算」のモデル

プログラミングで実行する処理全般を「計算」としたときに、この捉え方がモデルによって異なり大きく3つに分類される

  1. 命令型モデル
    「計算」=「命令を実行する」
  2. 関数型モデル
    「計算」=「関数を呼び出して値を得る」
  3. 論理型モデル
    「計算」=「証明を得る」

1.2. 命令型モデル

「計算機に命令を下し、計算機はその命令を実行するたびに内部の状態を変化させ、最終的に到達した状態が計算の結末である」
命令して得られた結果を都度記録して次の命令に繋げる
1つ1つの命令の柔軟性は高い
状態を管理して状態を再度利用する...といったフェーズを明示する必要があるため状態となりやすい

1.3. 関数型モデル

数学的な意味での「関数」をベースとする
特定の状態から別の状態(Aの状態からBの状態) へ「変換する」ルールで構成される
「変換する」ルールの組み合わせで表現することがベースとなり、原則状態の管理をせず、Immutableな要素のみを取り扱う
状態の「変換」の連なりで表現されるため、過程を捉えやすい (状態を別で管理が必要な場合には状態によって結果が異なる...となってしまい変動要素が増え把握がしづらくなる)

メリット

  1. 「置換ルール」といるシンプルな計算の仕組み
  2. 計算過程(状態)の捉えやすさ
  3. 関数を値として扱う姿勢
takuuuuuuu777takuuuuuuu777

第2章 なぜ関数型プログラミングが重要か

2.1 プログラミング言語における関数の特徴
2.2 関数型プログラミングの特徴
2.3 関数型プログラミングの利点

2.1 プログラミング言語における関数の特徴

数学的な関数は「入力が同じであればいつどこで呼び出されても返ってくる値は同じになる」性質を持つ (= 参照透過性)
※ プログラミング言語の場合には、「手順」として定義する必要があるため常に数学的な関数の定義を満たすわけではない

2.2 関数型プログラミングの特徴

■ ファーストクラスオブジェクト

値と同じように扱えるオブジェクト、関数の引数として指定できレスポンスとして受け取ることができる
Javascript では関数を変数としてバインドすることができ引数に渡したりレスポンスとして受け取ることも可能

■ 参照透過性

引数が同じであれば 必ず 結果も同一となる
参照透過性を実現するための要因

  • 可変なデータ
  • 変数の代入
  • 副作用

2.3 関数型プログラミングの利点

■ 高いモジュール性

状態の管理を除外して「変換するルール」を切り出すことができるのでより再利用性を向上することができる
関数型の場合如何に「変換するルール」を分解するかがコアとなるため汎用的なモジュールとなりやすく、結果として再利用性の高いモジュールとなる

■ テストが容易

参照透過性が担保されていれば当然テストはしやすい
また一般論として汎用性の高い細かいモジュールに分解されるためテストが用意となる観点もある

■ コードの正さを証明できる

数学的な証明式を使って機械的にテストを記載できる...
があくまで「変換」の順番や組み合わせを変えても結果は変わらない...というテストとなるので全てを証明できるわけではない
数学的な観点をテストに組み込むことも可能なため品質を上げる手段が追加で手に入っている...みたいなイメージ

takuuuuuuu777takuuuuuuu777

第3章 心の準備

3.1 DRY原則
3.2 抽象化への指向
3.3 セマンティクスを意識する
3.4 テストに親しむ
3.5 JavaScriptと関数型プログラミング

3.1 DRY原則

Don't Repeat Yourself
特に状態の管理を除外して「変換」

3.2 抽象化への指向

抽象化することでより再利用性が高いモジュールを実現することができる

3.3 セマンティクスを意識する

シンタックス(構文) ⇔ セマンティクス(意味論) = 「環境」

3.4 テストに親しむ

...特になし...テストのサンプルコードが少々

3.5 JavaScriptと関数型プログラミング

Javascriptの課題

  1. データの不変性が保証されない、typescriptにおいても動的型付のため完全に保証するものではない
  2. 動的型付き言語なので型情報を実行時に利用できない
  3. シングルスレッドのため並列処理における関数型の有用性は担保できない...
takuuuuuuu777takuuuuuuu777

第4章 データの種類と特徴

4.1 型とは何か
4.2 基本型
4.3 合成型
4.4 変数とデータの関係
4.5 参照透過性の仕組み

4.1 型とは何か

プログラムで扱う対象(データ)を整理するためのもの
「集合」と似ている
「型」である条件

  1. 同じ型に属するデータは同じ方法で生成可能
  2. その方に対して定義された演算が利用可能
  3. 階層(多相性)を持つ

4.2 基本型

「型」の中でも内部を構造を持たないデータ型
Javascriptにおいては以下の4つ

  1. Bool
  2. Number
  3. String
  4. Null / Undefined

4.3 合成型

内部に構造をもつもので主に以下

  1. オブジェクト
  2. 配列
  3. 関数

4.4 変数とデータの関係

4.5 参照透過性の仕組み

takuuuuuuu777takuuuuuuu777

第5章 プログラムをコントロールする仕組み

5.1 条件分岐の種類と特徴
5.2 反復処理の種類と特徴
5.3 再帰による反復処理

5.1 条件分岐の種類と特徴

  1. If文
  2. Switch文

if文はファーストクラスオブジェクトではなく、評価されても値を返すことができない
」:評価されても値を返すことができない
」:評価されると値を返す

5.2 反復処理の種類と特徴

5.3 再帰による反復処理