Upgrade to Pro — share decks privately, control downloads, hide ads and more …

不動点コンビネータって何ぞ #TechLunch

不動点コンビネータって何ぞ #TechLunch

2012/02/15(水) @ Livesense TechLunch
発表者:春日 太志

Livesense Inc.

April 23, 2014
Tweet

More Decks by Livesense Inc.

Other Decks in Technology

Transcript

  1. ⽬目次 Livesense  Inc. 2 1.  解説ブログ記事の紹介 2.  呼び⽅方⼀一覧 3.  不不動点とは

    4.  不不動点コンビネータとは 5.  Y-‐‑‒Combinator  とは 6.  Y-‐‑‒Combinator  を  Common  Lisp  で
  2. 1-‐‑‒1.  解説ブログ記事の紹介 Livesense  Inc. 3 Y  コンビネータって何?  -‐‑‒IT戦記-‐‑‒ id:amachang http://d.hatena.ne.jp/amachang/20080124/1201199469

    TuringとChurchの狭間で  -‐‑‒404  Blog  Not  Found-‐‑‒ @dankogai http://blog.livedoor.jp/dankogai/archives/50458503.html
  3. 3.  不不動点とは Livesense  Inc. 6 0と1は  f(x)  =  x^2  の不不動点

    f(x)  =  x  を満たす  x ⼀一階関数の不不動点は第⼀一級値 first-‐‑‒order  function first-‐‑‒class  value ⾼高階関数の不不動点は関数
  4. 5-‐‑‒1.  Y-‐‑‒Combinator  とは Livesense  Inc. 8 型なしラムダ計算の不不動点コンビネータの⼀一つ Haskell  Brooks  Curry

    1900/09/12  –  1982/09/01 Y  Combinator  LLC ある関数を与えるとそれを再帰する関数を返す関数
  5. 5-‐‑‒2.  Y-‐‑‒Combinator  とは Livesense  Inc. 9 Y g = (λf.(λx.f(x

    x))(λx.f(x x))) g = (λx.g(x x))(λx.g(x x)) = (λy.g(y y))(λx.g(x x)) = g((λx.g(x x))(λx.g(x x))) = g(Y g) Y = λf.(λx.f(x x))(λx.f(x x))
  6. 6-‐‑‒1.  Y-‐‑‒Combinator  を  Common  Lisp  で Livesense  Inc. 10 //

    ֊৐Λฦ͢ Javascript ؔ਺ྫʢ෭࡞༻͋Γʣ var hoge = function (n) { return (n == 1) ? 1 : n * arguments.callee(n - 1); }; hoge(3); // => 6 var fuga = function f(n) { return (n == 1) ? 1 : n * f(n - 1); }; fuga(3); // => 6
  7. 6-‐‑‒2.  Y-‐‑‒Combinator  を  Common  Lisp  で Livesense  Inc. 11 //

    Javascript Ͱ࣮૷ͨ͠ Y Combinator var Y = function (f) { return (function (g) { return function (m) { return f(g(g))(m); }; })(function (g) { return function (m) { return f(g(g))(m); }; }); };
  8. 6-‐‑‒3.  Y-‐‑‒Combinator  を  Common  Lisp  で Livesense  Inc. 12 //

    ֊৐ܭࢉͰ Y Combinator Λ࢖͏ Y(function (fact) { return function (n) { return (n == 1) ? 1 : n * fact(n - 1); }; })(3); // => 6 // Y-Combinator ؔ਺ΛҾ਺Ͱ౉ͤΔΑ͏ʹϥοϓ͢Ε͹ɺ // ແ໊ؔ਺͚ͩͰಈ͘͜ͱʹͳΓ·͢ɻ
  9. 6-‐‑‒4.  Y-‐‑‒Combinator  を  Common  Lisp  で Livesense  Inc. 13 ;

    ֊৐Λฦ͢ (defun fact (n) (if (= n 1) 1 (* n (fact (- n 1))))) これを無名再帰まで持っていく...
  10. 6-‐‑‒5.  Y-‐‑‒Combinator  を  Common  Lisp  で Livesense  Inc. 14 ;

    ֊৐Λฦ͢ (funcall ((lambda (f) ((lambda (g) (lambda (m) (funcall (funcall f (funcall g g)) m))) (lambda (g) (lambda (m) (funcall (funcall f (funcall g g)) m))))) (lambda (fact) (lambda (n) (if (= n 1) 1 (* n (funcall fact (- n 1))))))) 3)