Contenu connexe
Similaire à Currying in perl (7)
Plus de Masahiro Honma (20)
Currying in perl
- 7. カリー化とは
• A × B→Cの関数を、A→(B→C)にする
• hoge($x, $y) みたいな関数を
curried_hoge($x)($y) みたいにする
- 9. 部分適用とは
• A × B→Cの関数を、B→Cにする
• hoge($x, $y) みたいな関数に3を適用して
hoge_3($y) みたいにする
- 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. 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. 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. 使い方
sub add { $_[0] + $_[1] + $_[2] }
my $x = (curry_n 3, &add)->(3)(4)(5);
- 16. 使い方
sub add { $_[0] + $_[1] + $_[2] }
まとめたい
my $x = (curry_n 3, &add)->(3)(4)(5);
- 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. 新しい関数を作る
curry_nは2引数関数
*curried_curry_n = curry_n(2, &curry_n);
*curry3 = curried_curry_n(3);
引数の数を部分適用して新しい関数にする
my $x = curry3(&add)->(3)(4)(5);
- 21. カリー化すると
部分適用しやすい
*curry3 = curried_curry_n(3);
*curry4 = curried_curry_n(4);
*curry5 = curried_curry_n(5);
*{“curry$_”} = curried_curry_n($_)
for 3.. 10000000;
- 25. プロトタイプを使う
sub parse_proto ($) {
my $f = shift;
my $proto = prototype $f;
$proto =~ /^([&_+*$]|[[$@%&*]+]|[$@
%&*])(.+)/ ? ($1, $2) : (undef, $proto);
}
- 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. プロトタイプを使う
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. 使い方
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. 使い方
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;
かっこなくてもよい
- 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. currying builtins
use 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. currying builtins
use 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;
かっこなくてもよい