Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

Deriving the Y Combinator

1 080 vues

Publié le

(日本語説明下記)Here I try to derive the Y Combinator as simple as possible.

Yコンビネータは、変数を使わずに再帰関数をつくるための便利な考え方です。 Y Combinatorという名前は、同名のシリコンバレーの起業家支援プログラムが登場したため、一躍有名になりました(Google検索が難しくなりました)。
こっちの Y Combinatorを検索したいときは、
「Y Combinator 再帰」「Y Combinator ラムダ」などで検索してみてください。

Publié dans : Ingénierie
  • WONDERFUL JOB!.... STARTUPS...Send your pitchdeck to over 5700 of VC's and Angel's with just 1 click. Visit: Angelvisioninvestors.com
       Répondre 
    Voulez-vous vraiment ?  Oui  Non
    Votre message apparaîtra ici
  • BTW nice presentation!.... Also you can send your pitchdeck to thousands of VC's and Angel's with just 1 click. Visit: Angelvisioninvestors.com
       Répondre 
    Voulez-vous vraiment ?  Oui  Non
    Votre message apparaîtra ici
  • great job!!!!!!!!!!!!!! you gave a nice presentation today.
       Répondre 
    Voulez-vous vraiment ?  Oui  Non
    Votre message apparaîtra ici

Deriving the Y Combinator

  1. 1. Deriving the Y Combinator Yuta Okazaki! Recurse Center Spring 2 2015
  2. 2. Recursive Function factorial = function(n){ if(n == 0){ return 1 } else{ n * factorial(n - 1) } } Pseudo Code
  3. 3. Recursive Function let’s simplify this to an ‘infinite’ function. fact-forever = function(n){ n * fact-forever(n - 1) }
  4. 4. Recursive Function What if we can’t use a variable? fact-forever = function(n){ n * fact-forever(n - 1) }
  5. 5. Recursive Function What is this inside ‘fact-forever’ gonna be? fact-forever = function(n){ n * fact-forever(n - 1) }
  6. 6. function(n){ ! n * (n - 1) ! } Recursive Function I’m imagining if we have a ‘magical function’, that prepares itself again when we need it…
  7. 7. Thought Experiment with Scheme(Lisp)
  8. 8. Thought Experiment #1 Is it possible to think of a lambda, which returns a lambda, that takes ‘itself’ as an argument? ((lambda(me)(me me)) (lambda(x)(quote hi)))
  9. 9. Thought Experiment #1 Is it possible to think of a lambda, which returns a lambda, that takes ‘itself’ as an argument? ((lambda(me)(me me)) (lambda(x)(quote hi))) => ‘hi
  10. 10. ((lambda(me)(me me)) (lambda(x)( ))) Thought Experiment #2 Since ‘me’ function takes ‘me’ as an argument, isn’t it fun if we can somehow use it inside it? quote hi
  11. 11. ((lambda(me)(me me)) (lambda(x)( ))) Thought Experiment #2 Since ‘me’ function takes ‘me’ as an argument, isn’t it fun if we can somehow use it inside it? x
  12. 12. ((lambda(me)(me me)) (lambda(x)( ))) Thought Experiment #2 Since ‘me’ function takes ‘me’ as an argument, isn’t it fun if we can somehow use it inside it? => expects 1 argument, but found none. x
  13. 13. ((lambda(me)(me me)) (lambda(x)( ))) Thought Experiment #3 Yeah my bad, x is a lambda expecting one argument. so… pass in x itself maybe? x
  14. 14. ((lambda(me)(me me)) (lambda(x)( ))) Thought Experiment #3 Yeah my bad, x is a lambda expecting one argument. so… pass in x itself maybe? xx =>
  15. 15. ((lambda(me)(me me)) (lambda(x)( ))) Thought Experiment #3 Yeah my bad, x is a lambda expecting one argument. so… pass in x itself maybe? xx ((lambda(x)(x x)) (lambda(x)(x x))) =>
  16. 16. ((lambda(me)(me me)) (lambda(x)( ))) Thought Experiment #3 Yeah my bad, x is a lambda expecting one argument. so… pass in x itself maybe? => infinite loop! xx ((lambda(x)(x x)) (lambda(x)(x x))) =>
  17. 17. Thought Experiment #3 This is the Javascript version of same thing. function(x){ return x(x) }(function(x){return x(x)})
  18. 18. ((lambda(me)(me me)) (lambda(x)( ))) Resume the Problem So, how can we use this piece with the original problem? xx function(n) n * (n - 1)
  19. 19. ((lambda(x) x )(quote hi)) Functional Refactoring Wrap Function ((lambda(y)((lambda(x)x)y))(quote hi)) if you have a lambda that takes one argument, you can wrap it with another lambda which also takes one argument, and call it with that argument, you still get the same result.
  20. 20. ((lambda(me)( me me )) (lambda(x) Combine them So, here I use a twisted version of Wrap Function, in order to accumulate the calculation. (lambda(number)(number * ( ( x x ))) (number - 1))))
  21. 21. ((lambda(me)( me me )) (lambda(x) Combine them So, here I use a twisted version of Wrap Function, in order to accumulate the calculation. (lambda(number)(number * ( ( x x ) )) (number - 1))))
  22. 22. ((lambda(me)( me me )) (lambda(x) Combine them So, here I use a twisted version of Wrap Function, in order to accumulate the calculation. (lambda(number)(number * ( ( x x ) )) (number - 1))))
  23. 23. ((lambda(me)( me me )) (lambda(x) Combine them So, here I use a twisted version of Wrap Function, in order to accumulate the calculation. (lambda(number)(number * ( ( x x ) )) (number - 1))))
  24. 24. Ω Combinator ((lambda(me)( me me )) (lambda(x) The code below is an application of Ω Combinator. (lambda(number)(number * ( ( x x ) )) (number - 1)))) Demo Available
  25. 25. Where’s Y Combinator? Y Combinator is a nicer form of Omega Combinator. If you want to derive one, please talk to me! (lambda(le) ((lambda(f)(f f)) (lambda(f) (le (lambda(x) ((f f) x)))))) Twitter @kenzan100

×