JavaScript関数型プログラミング Ch.2 関数型言語としてのJavaScript
なぜJavaScriptなのか
- 最も広範に使われている言語
- Webの言語
- C言語(手続型筆頭)に似た文法
- 関数型言語からも強く影響を受けている
- 関数型プログラミングに適した機能が追加されつつある
- アロー関数
- 第一級関数を簡単に書ける
- 定数
- イテレータ
- Promise
- アロー関数
- OOP・FP両方書ける言語
関数型プログラミングvsオブジェクト指向プログラミング
FP | OOP | |
---|---|---|
合成の単位 | 関数 | オブジェクト・クラス |
プログラミングスタイル | 宣言型 | 命令型 |
データと振る舞い | 純粋で独立した関数との緩い結合 | クラス内でメソッドと強い結合 |
状態管理 | 不変 | インスタンスメソッドで変更 |
フロー制御 | 関数と再帰 | ループと条件分岐 |
スレッド安全性 | 並列プログラミング可能 | 困難 |
カプセル化 | すべてが不変なので不要 | データの整合性(invariant)を保つために必要 |
抽象化の中心 | 関数 | オブジェクト |
状態管理
- 規律ベース
- 言語仕様としては何でもできちゃう
オブジェクトを値として使う
- 「値」...不変(immutable)なデータのことをいっている
- const: エセimmutable
- メンバはmutable
- 本気でimmutableを実現したいなら...
深いフリーズ
- Object.freeze()はown propertyでなくても不変にしてくれる
- が、浅いフリーズ
- メンバをconstにするだけ
frozen.child.grandchild
はmutable
- 深いフリーズを実現するには、再帰する
レンズ
- 関数参照、とも
- 状態をもつデータ型の属性を不変的にアクセスし操作できる関数
- Ramdaライブラリに搭載されている
const lens = R.lensProp('prop'); R.view(lens, obj)
- getterと大して変わらない。
obj.prop
が得られる
- getterと大して変わらない。
var obj2 = R.set(lens, 'hoge', obj)
obj2
を新しく生成し、obj2.prop = 'hoge'
が設定される。obj.prop
は不変- 不変セッター
- copy-on-write (書き込み時コピー)のエレガントな実装法
- 効能
- mutableなオブジェクトのデータを保護するラッパ
- メンバアクセスのロジックをオブジェクトから分離
- 関数型の根本原理と相性が良い
- this依存を取り除き、どのようなオブジェクトの内容でも参照し操作できる
- thisは副作用の温床
- 後半はよくわからない
関数
クロージャとスコープ
まとめ
比較的しょうもないので略