JavaScript関数型プログラミング Ch.3 データ構造の数を減らし、操作の数を増やす

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

アプリケーションの制御フローを理解する

  • 宣言的プログラミング。メソッドを連結

    • 簡潔かつ円滑
    • 表現力豊か

メソッドチェーン

  • obj.opt1().opt2().opt3(); って感じのやつ

    • 特に、同一のオブジェクトに副作用を積み重ねていくヤツをメソッドカスケードという

関数チェーン

  • _(persons).map(func1).reduce(func2); って感じのやつ
  • 副作用なし
  • 各ステップではimmutableな新しいオブジェクトを返している
  • _はLodashのエントリポイント

    • “low-dash”
    • Underscore.jsの派生プロジェクト

      • インタフェースは同じだが、さらに洗練し、パフォーマンスも高くするべく、実装はまるまる書き換えている
  • iterableに対する、mapとかreduceとかreduceRightとかsomeとかeveryとかfilterとかlist comprehensionとかの話。略

コードを把握する

  • FPでは、プログラムの内部的な詳細について明らかにすることなく、プログラムの目的についてはっきりと描写する
  • コードだけでなく、データがステージ間を流れていって結果が生成される様子について、より深く把握できるようになる

宣言型および遅延関数チェーン

  • Lodashを例にあげる
  • _.chain(arr)で配列を包み、各種高階関数等をチェーンできる
  • 遅延関数チェーン

    • value()を呼び出して初めて関数チェーンは評価される
  • 遅延評価の利点

    • 不要なら一切関数を評価しないことができる
    • method fusionによる高速化

      • 正味の処理は変わらないが、関数呼び出しのオーバヘッドを減らす

SQLライクなデータ:関数としてのデータ

  • Lodashの使い方のお勉強

    • _.mixin()でコアライブラリを拡張できる

      • select’: _.map`といった別名を定義したり
  • データとしての関数

    • SQLのように、データを関数の形にモデル化

再帰的に考えることを学ぶ

  • foldl,foldr,木の走査とか。略
  • TCO: Tail Call Optimization

    • ES6仕様
    • 末尾再帰は繰り返し処理とほぼ同等の性能になる