Javascriptで学ぶ Functional Programming

  • 3,118 views
Uploaded on

Lean Functional Programming with Javascript (in Japanese). …

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 実用的でないという意味ではありません。

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
3,118
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
26
Comments
0
Likes
13

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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