タイトルのまま
書いてみた
#!/usr/bin/env perl
use 5.10.0;
use strict;
use warnings;
sub curry {
my $func = shift;
my $argc = shift;
my @arg1 = @_;
return sub {
my @arg2 = @_;
if(scalar(@arg1) + scalar(@arg2) >= $argc){
return &$func(@arg1, @arg2);
}
return curry($func, $argc, @arg1, @arg2);
}
}
カリー化させたいサブルーチンと、必要な引数の数を渡す。
sub add2 {
my ($a,$b) = @_;
return $a + $b;
}
my $ca = curry(\&add2, 2);
say &$ca(1,2);
my $ca2 = curry(\&add2, 2, 1);
say &$ca2(2);
say "=============";
sub mul3 {
my ($a,$b,$c) = @_;
return $a * $b * $c;
}
my $cm = curry(\&mul3, 3);
say &$cm(2,3,4);
my $cm2 = &$cm(2);
say &$cm2(3,4);
my $cm3 = curry(\&mul3, 3, 2, 3);
say &$cm3(4);
my $cm4 = curry(\&mul3, 3, 2);
my $cm5 = &$cm4(3);
say &$cm5(4);
@_のおかげか、書きやすかった。
その分、最初に必要な引数の数を教えてあげる必要があるのが残念だが。