Your SlideShare is downloading. ×
0
CurryとHokkaido.pm     2013.3.9 hiratara                         FreakOut
初代ベスト エルティニスト賞
“Hokkaido.pm Casual はじめました” by techno_nekoスープCurryが観客の心と胃袋をつかみ、初代ベストエルティニスト賞となりました!おめでとうございました!http://hachiojipm.org/?p=403
“Hokkaido.pm Casual はじめました” by techno_nekoスープCurryが観客の心と胃袋をつかみ、初代ベストエルティニスト賞となりました!おめでとうございました!http://hachiojipm.org/?p=403
Curryが         ウケるっぽい
currying
カリー化とは• A × B→Cの関数を、A→(B→C)にする• hoge($x, $y) みたいな関数を curried_hoge($x)($y) みたいにする
カリー化と 部分適用は違うよ
部分適用とは• A × B→Cの関数を、B→Cにする• hoge($x, $y) みたいな関数に3を適用して hoge_3($y) みたいにする
誤用すると色々危ない
curry関数の実装sub curry {    my $f = shift;    sub {        my $x = shift;        sub { $f->($x, @_) };    };}
再帰的にカリー化• hoge($x, $y, $z) みたいな関数は curried_hoge($x)($y, $z) じゃなく curried_hoge($x)($y)($z) みたいにしたい• A × B × C→D A→(B × C→D)...
curry_n関数の実装sub curry_n {    my ($n, $f) = @_;    $n <= 1        ? $f        : sub {              my $x = shift;          ...
curry_n関数の実装sub curry_n {           引数の個数が必要    my ($n, $f) = @_;    $n <= 1        ? $f        : sub {              my $x...
使い方sub add { $_[0] + $_[1] + $_[2] }my $x = (curry_n 3, &add)->(3)(4)(5);
使い方sub add { $_[0] + $_[1] + $_[2] }                まとめたいmy $x = (curry_n 3, &add)->(3)(4)(5);
カレーをカレーで食べる
新しい関数を作る*curried_curry_n = curry_n(2, &curry_n);*curry3 = curried_curry_n(3);my $x = curry3(&add)->(3)(4)(5);
新しい関数を作る                      curry_nは2引数関数*curried_curry_n = curry_n(2, &curry_n);*curry3 = curried_curry_n(3);my $x = cu...
新しい関数を作る                      curry_nは2引数関数*curried_curry_n = curry_n(2, &curry_n);*curry3 = curried_curry_n(3);    引数の数を部...
カリー化すると                部分適用しやすい*curry3 = curried_curry_n(3);*curry4 = curried_curry_n(4);*curry5 = curried_curry_n(5);*{“c...
ほんとに引数の数ってわからないの?
($$$)
I ♡ function prototyping
プロトタイプを使うsub parse_proto ($) {    my $f = shift;    my $proto = prototype $f;    $proto =~ /^([&_+*$]|[[$@%&*]+]|[$@%&*])(...
プロトタイプを使うsub curry_proto_n ($) {  my $f = shift;  my ($p, $ps) = parse_proto $f;    ! $p ? $f         : eval qq/sub ($p) {...
プロトタイプを使うsub curry_proto_n ($) {  my $f = shift;  my ($p, $ps) = parse_proto $f;    ! $p ? $f         : eval qq/sub ($p) {...
使い方sub add ($$$) { $_[0] + $_[1] + $_[2] }my $x = (curry_proto_n &add)->(3)(4)(5);BEGIN { *add10 = (curry_proto &add)->(10...
使い方sub add ($$$) { $_[0] + $_[1] + $_[2] }my $x = (curry_proto_n &add)->(3)(4)(5);BEGIN { *add10 = (curry_proto &add)->(10...
One more  function prototyping
Pod::Functions% perl -MPod::Functions -e eval { print $_, "t",+(prototype "CORE::$_"), "n" } for keys %Flavor...getgrgid  ...
currying builtinsuse 5.16.2;my $x = (curry_proto_n &CORE::substr)->("abcde")(1)(2);BEGIN {    *substr_abcde = (curry_proto...
currying builtinsuse 5.16.2;my $x = (curry_proto_n &CORE::substr)->("abcde")(1)(2);BEGIN {    *substr_abcde = (curry_proto...
まとめ• カリー化すると部分適用しやすい• &CORE::xxx によりさらに便利に• プロトタイプ使うと隣の同僚に DISられる
Upcoming SlideShare
Loading in...5
×

Currying in perl

2,420

Published on

http://www.slideshare.net/hiratara/hokkaidopm-17020206 の本物の方。

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
2,420
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Currying in perl"

  1. 1. CurryとHokkaido.pm 2013.3.9 hiratara FreakOut
  2. 2. 初代ベスト エルティニスト賞
  3. 3. “Hokkaido.pm Casual はじめました” by techno_nekoスープCurryが観客の心と胃袋をつかみ、初代ベストエルティニスト賞となりました!おめでとうございました!http://hachiojipm.org/?p=403
  4. 4. “Hokkaido.pm Casual はじめました” by techno_nekoスープCurryが観客の心と胃袋をつかみ、初代ベストエルティニスト賞となりました!おめでとうございました!http://hachiojipm.org/?p=403
  5. 5. Curryが ウケるっぽい
  6. 6. currying
  7. 7. カリー化とは• A × B→Cの関数を、A→(B→C)にする• hoge($x, $y) みたいな関数を curried_hoge($x)($y) みたいにする
  8. 8. カリー化と 部分適用は違うよ
  9. 9. 部分適用とは• A × B→Cの関数を、B→Cにする• hoge($x, $y) みたいな関数に3を適用して hoge_3($y) みたいにする
  10. 10. 誤用すると色々危ない
  11. 11. curry関数の実装sub curry { my $f = shift; sub { my $x = shift; sub { $f->($x, @_) }; };}
  12. 12. 再帰的にカリー化• hoge($x, $y, $z) みたいな関数は curried_hoge($x)($y, $z) じゃなく curried_hoge($x)($y)($z) みたいにしたい• A × B × C→D A→(B × C→D) A→(B→(C→D))
  13. 13. curry_n関数の実装sub curry_n { my ($n, $f) = @_; $n <= 1 ? $f : sub { my $x = shift; my $fx = curry($f)->($x); curry_n($n - 1, $fx); };}
  14. 14. curry_n関数の実装sub curry_n { 引数の個数が必要 my ($n, $f) = @_; $n <= 1 ? $f : sub { my $x = shift; my $fx = curry($f)->($x); curry_n($n - 1, $fx); };}
  15. 15. 使い方sub add { $_[0] + $_[1] + $_[2] }my $x = (curry_n 3, &add)->(3)(4)(5);
  16. 16. 使い方sub add { $_[0] + $_[1] + $_[2] } まとめたいmy $x = (curry_n 3, &add)->(3)(4)(5);
  17. 17. カレーをカレーで食べる
  18. 18. 新しい関数を作る*curried_curry_n = curry_n(2, &curry_n);*curry3 = curried_curry_n(3);my $x = curry3(&add)->(3)(4)(5);
  19. 19. 新しい関数を作る curry_nは2引数関数*curried_curry_n = curry_n(2, &curry_n);*curry3 = curried_curry_n(3);my $x = curry3(&add)->(3)(4)(5);
  20. 20. 新しい関数を作る curry_nは2引数関数*curried_curry_n = curry_n(2, &curry_n);*curry3 = curried_curry_n(3); 引数の数を部分適用して新しい関数にするmy $x = curry3(&add)->(3)(4)(5);
  21. 21. カリー化すると 部分適用しやすい*curry3 = curried_curry_n(3);*curry4 = curried_curry_n(4);*curry5 = curried_curry_n(5);*{“curry$_”} = curried_curry_n($_) for 3.. 10000000;
  22. 22. ほんとに引数の数ってわからないの?
  23. 23. ($$$)
  24. 24. I ♡ function prototyping
  25. 25. プロトタイプを使うsub parse_proto ($) { my $f = shift; my $proto = prototype $f; $proto =~ /^([&_+*$]|[[$@%&*]+]|[$@%&*])(.+)/ ? ($1, $2) : (undef, $proto);}
  26. 26. プロトタイプを使うsub curry_proto_n ($) { my $f = shift; my ($p, $ps) = parse_proto $f; ! $p ? $f : eval qq/sub ($p) { my $x = shift; my $fx = sub ($ps) { $f->($x, @_) }; curry_proto_n $fx; }/;}
  27. 27. プロトタイプを使うsub curry_proto_n ($) { my $f = shift; my ($p, $ps) = parse_proto $f; ! $p ? $f : eval qq/sub ($p) { my $x = shift; my $fx = sub ($ps) { $f->($x, @_) }; curry_proto_n $fx; }/;}
  28. 28. 使い方sub add ($$$) { $_[0] + $_[1] + $_[2] }my $x = (curry_proto_n &add)->(3)(4)(5);BEGIN { *add10 = (curry_proto &add)->(10) }my $x = add10 3, 4;
  29. 29. 使い方sub add ($$$) { $_[0] + $_[1] + $_[2] }my $x = (curry_proto_n &add)->(3)(4)(5);BEGIN { *add10 = (curry_proto &add)->(10) }my $x = add10 3, 4; かっこなくてもよい
  30. 30. One more function prototyping
  31. 31. Pod::Functions% perl -MPod::Functions -e eval { print $_, "t",+(prototype "CORE::$_"), "n" } for keys %Flavor...getgrgid $connect *$dbmopen %$$link $$rand ;$dbmclose %msgsnd $$$umask ;$sleep ;$seek *$$
  32. 32. currying builtinsuse 5.16.2;my $x = (curry_proto_n &CORE::substr)->("abcde")(1)(2);BEGIN { *substr_abcde = (curry_proto &CORE::substr)->("abcde");}my $y = substr_abcde 1, 2;
  33. 33. currying builtinsuse 5.16.2;my $x = (curry_proto_n &CORE::substr)->("abcde")(1)(2);BEGIN { *substr_abcde = (curry_proto &CORE::substr)->("abcde");}my $y = substr_abcde 1, 2; かっこなくてもよい
  34. 34. まとめ• カリー化すると部分適用しやすい• &CORE::xxx によりさらに便利に• プロトタイプ使うと隣の同僚に DISられる
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×