JavaScript関数型プログラミング Ch.2 関数型言語としてのJavaScript

JavaScript勉強メモ関数型プログラミング

出典: 

なぜJavaScriptなのか

  • 最も広範に使われている言語

    • Webの言語
  • C言語(手続型筆頭)に似た文法
  • 関数型言語からも強く影響を受けている

    • Lisp

      • いうほどか?letとかくらいじゃ
    • Scheme
  • 関数型プログラミングに適した機能が追加されつつある

    • アロー関数

      • 第一級関数を簡単に書ける
    • 定数
    • イテレータ
    • Promise
  • OOP・FP両方書ける言語

関数型プログラミングvsオブジェクト指向プログラミング

  • ScalaやF#など…ハイブリッド言語

    • パラダイム融合
  • JSも似てる
  • OO-JS: プロトタイプベースの継承を行う
FP OOP
合成の単位 関数 オブジェクト・クラス
プログラミングスタイル 宣言型 命令型
データと振る舞い 純粋で独立した関数との緩い結合 クラス内でメソッドと強い結合
状態管理 不変 インスタンスメソッドで変更
フロー制御 関数と再帰 ループと条件分岐
スレッド安全性 並列プログラミング可能 困難
カプセル化 すべてが不変なので不要 データの整合性(invariant)を保つために必要
抽象化の中心 関数 オブジェクト

状態管理

  • 規律ベース

    • 言語仕様としては何でもできちゃう

オブジェクトを値として使う

  • 「値」…不変(immutable)なデータのことをいっている
  • const: エセimmutable

    • メンバはmutable
  • 本気でimmutableを実現したいなら…

    • 値オブジェクトパターン(Value Object)

      • クロージャでオブジェクトを返す
      • オブジェクトはgetterメソッド等のみをもつ
      • オブジェクトの内部表現はクロージャのスコープに
    • Object.freeze()

深いフリーズ

  • Object.freeze()はown propertyでなくても不変にしてくれる
  • が、浅いフリーズ

    • メンバをconstにするだけ
    • frozen.child.grandchild はmutable
  • 深いフリーズを実現するには、再帰する

レンズ

  • 関数参照、とも
  • 状態をもつデータ型の属性を不変的にアクセスし操作できる関数
  • Ramdaライブラリに搭載されている

    • const lens = R.lensProp('prop'); R.view(lens, obj)

      • getterと大して変わらない。obj.propが得られる
    • var obj2 = R.set(lens, 'hoge', obj)

      • obj2を新しく生成し、obj2.prop = 'hoge'が設定される。obj.propは不変
      • 不変セッター
  • copy-on-write (書き込み時コピー)のエレガントな実装法
  • 効能

    • mutableなオブジェクトのデータを保護するラッパ
    • メンバアクセスのロジックをオブジェクトから分離

      • 関数型の根本原理と相性が良い
    • this依存を取り除き、どのようなオブジェクトの内容でも参照し操作できる

      • thisは副作用の温床
      • 後半はよくわからない

関数

クロージャとスコープ

まとめ

比較的しょうもないので略