by shigemk2

当面は技術的なことしか書かない

ES6による 関数型プログラミング #es6_casual

関数型プログラミング

  • 副作用の排除
  • 関数オブジェクトを駆使

JSと関数型との関数

Schemeの第一級関数オブジェクトを受け継いだ言語

ECMA6

  • 変更不可能な変数宣言
  • パターンマッチ
  • 再帰による繰り返し
  • 不変なデータ構造

変更不可能な変数宣言

  • const(Scalaのvalみたいな束縛)

パターンマッチ

  • 代入の副作用を減らす
  • 分割代入 パターンによって値を抽出

再帰による繰り返し

  • 再帰のほうが代入の副作用を使わずに書けるが、スタックオーバーフローの危険がある
  • 末尾呼び出し最適化
  • 戻る位置をスタックに記憶しておく
  • 末尾呼び出し最適化が実装されたら解決される問題

不変なデータ構造

  • データ構造は不変なので、自身の値を変更しない
  • ECMAのプロキシオブジェクトを使えばそれが実現出来ちゃう

    • コードを実装して挙動を変えることを可能にする
  • プロキシによるイミュータブルな配列 破壊メソッドにsliceを挟んで非破壊メソッドに変えたり出来る

  • プロキシで作った不変配列と配列では使い方と挙動に違いはないが、破壊メソッドを使うときに挙動が変わってくる。不変配列でreserveとかを使っても操作後の配列の中身は変わらない

まとめ

関数型の機能をES6でどう実現化するか

  • const
  • 分割代入
  • 末尾呼び出し最適化
  • プロキシ

ESになっても完全な関数型にはならないが、表現力は上がっている