関数型プログラミング
- 副作用の排除
- 関数オブジェクトを駆使
JSと関数型との関数
Schemeの第一級関数オブジェクトを受け継いだ言語
ECMA6
- 変更不可能な変数宣言
- パターンマッチ
- 再帰による繰り返し
- 不変なデータ構造
変更不可能な変数宣言
- const(Scalaのvalみたいな束縛)
パターンマッチ
- 代入の副作用を減らす
- 分割代入 パターンによって値を抽出
再帰による繰り返し
- 再帰のほうが代入の副作用を使わずに書けるが、スタックオーバーフローの危険がある
- 末尾呼び出し最適化
- 戻る位置をスタックに記憶しておく
- 末尾呼び出し最適化が実装されたら解決される問題
#es6_casual 末尾呼び出し最適化の実装状況です "Chromium Dashboard" https://t.co/feOjv9cl1o
— azu (@azu_re) 2014, 10月 29
末尾再帰最適化はなぜかes6-tableの1段目にある http://t.co/2LA0qXgvzF #es6_casual
— teppeis (@teppeis) 2014, 10月 29
不変なデータ構造
- データ構造は不変なので、自身の値を変更しない
ECMAのプロキシオブジェクトを使えばそれが実現出来ちゃう
- コードを実装して挙動を変えることを可能にする
プロキシによるイミュータブルな配列 破壊メソッドにsliceを挟んで非破壊メソッドに変えたり出来る
- プロキシで作った不変配列と配列では使い方と挙動に違いはないが、破壊メソッドを使うときに挙動が変わってくる。不変配列でreserveとかを使っても操作後の配列の中身は変わらない
まとめ
関数型の機能をES6でどう実現化するか
- const
- 分割代入
- 末尾呼び出し最適化
- プロキシ
ESになっても完全な関数型にはならないが、表現力は上がっている