Javascriptで学ぶ Functional Programming

4,062 views

Published on

Lean Functional Programming with Javascript (in Japanese).
This slide introduce 1. Anonymous Function 2. Lexical Scope 3. Referential Transparency 4. Higher Order Function 5.Currying 6.Function Composition 実用的でないという意味ではありません。

Published in: Technology

Javascriptで学ぶ Functional Programming

  1. 1. Javascript勉強会 <ul>Javascriptで学ぶ Functional Programming @todorokit </ul>
  2. 2. はじめに僕のjs&関数型レベル <ul><li>前々職でAjax & オブジェクト思考的な開発
  3. 3. 前職で Action Script Lite2で面倒臭い事を!
  4. 4. 関数型:Emacs Lispを12年前から
  5. 5. 9年前からSchemeで本格入門
  6. 6. Haskellも7年くらい前からやっている </li></ul>
  7. 7. <ul>Javascriptを使ってFunctional Programming の美味しい所を説明する予定です Javascriptの基礎は よくある言語に似ているので割愛 オブジェクト指向も記事がたくさんあるので割愛(使いませんが) </ul>発表内容について
  8. 8. Functional Programming (関数型プログラミング) Functional Programming とは数学的な関数の評価を行い, 状態やデータの変更を行わない プログラミングパラダイムである. ルーツはλ計算であり 匿名関数 を持つ. ->Javascriptでも簡単な事ならできる.
  9. 9. ( 普通のプログラマにとって ) Functional Programming の嬉しい事 複雑な事を簡潔に表現できる. 思考も簡潔にできる. 何度も同じコードを見る場合は (多少難しくても)簡潔な記述が勝る. 何度も見るはずなのですぐに難しく無くなる. 得られるものが大きいので 学習コストや時間対効果は良い.
  10. 10. Anonymous Function (匿名関数) 特別に関数名を持たない関数. 変数, 引数等にも与えられる.  function (x) {  return x * 2;  }(4); // => 8  var times2 = function (x){return x*2;};
  11. 11. <ul>Lexical Scope (構文スコープ) </ul><ul>構文上で決定できるスコープを使用する方法. これを持つ匿名関数をclosureと言う. var y = 3; function x () { var y = 1; return function (){ return y;}; } x()(); // => 1 </ul>
  12. 12. <ul>Lexical Scope (例2) </ul><ul>var setTimeout = function (proc, time) { var timer = {}; //private変数のように使える timer = setInterval(function() { proc(); clearInterval(timer); }, time); } </ul>
  13. 13. Referential Transparency (参照透明性) <ul>関数において引数が決まれば戻り値が決まる特性のことを言う.以下参照不透明な例   var x = 1;   function incx(n){   x += n;   return x;   }   incx(1); incx(1); // それぞれ 2,3 が返る </ul>
  14. 14. Referential Transparency(例) <ul>function sum(i) { if(i<=0) { return 0; } else { return sum(i-1)+i; } } </ul>
  15. 15. Referential Transparency の特徴 <ul>参照透明なプログラムは組んだ時点で答えが決まる.そのため,バグを発生しにくくなり,細部が理解し易いプログラムになる. また,簡約(reduction)ができるため,プログラム自体の最適化がしやすい. </ul>
  16. 16. Higher Order Function (高階関数) <ul>関数を引数に取る関数のこと . 関数自体は何でもできるので , それを引数に取る事により プログラムの特定の部分を柔軟に指定できる . そのためプログラムの構造を再利用できる . </ul>
  17. 17. Higher Order Function(例) <ul>function any (predicate, array1) { for(var key in array1) { if(predicate(array1[key])) { return true; } } return false; } </ul>
  18. 18. Higher Order Function(例) <ul>続き ... var even = function(x){return x % 2 == 0;} var odd = function(x){return x % 2 == 1;} any(even, [1,1,3,5,7,9]); // => false any( odd, [1,1,3,5,8,9]); // => true </ul>
  19. 19. これだけは覚えよう Higher Order Function <ul><li> fold (reduce)
  20. 20.  map
  21. 21.  any
  22. 22.  all (every)
  23. 23.  filter
  24. 24.  remove </li></ul>
  25. 25. <ul>Currying (カリー化.JSでは関数の部分適用) </ul><ul>var plus = function(x,y){return x+y;} plus2 = curry(plus, 2); // function(y){return 2+y} plus2(2); // => 4 ソースは長いのでwebで. good partsのはconcatが配列時の動作が変わるので不十分. ※curryという概念は部分適用ではないが動作は似ている </ul>
  26. 26. Function Composition (関数合成) <ul>関数を部品のように扱い,合成し組み立てる. これを用いてパーザコンビネータや ポイントフリースタイルも実現できる. (適切な言葉が見当たらなかったので 「関数合成」を広い意味で使いました) 関連する部分が参照透明で コンパイラが最適化しなければ実行速度は遅い. ほぼHaskellのみが可能. </ul>
  27. 27. Function Composition (例) function compose(f,g){ return function(x){ return curry(f,curry(g,x)); } } var array2d_times = compose(map,map)(times2); // point free array2d_times([[1,2],[3,4]]); //=> [[2,4],[6,8]] compose(all,any)(even)([[1,2],[3,4]]); //=> true
  28. 28. 終わりに <ul>実際に書いてみないと分かりにくいですが Functional Programmingは簡潔かつ強力です. また,新しい概念が入ってくるのは ここら辺の分野からが多いと思います. 是非みなさんもFunctional Programming で遊んでみましょう. </ul>

×