48 lines
650 B
Perl
48 lines
650 B
Perl
|
|
|
|
###
|
|
### Curry.pm
|
|
###
|
|
|
|
## Chapter 7 section 2.1
|
|
|
|
package Curry;
|
|
use base 'Exporter';
|
|
@EXPORT = ('curry');
|
|
@EXPORT_OK = qw(curry_listfunc curry_n);
|
|
|
|
sub curry_listfunc {
|
|
my $f = shift;
|
|
return sub {
|
|
my $first_arg = shift;
|
|
return sub { $f->($first_arg, @_) };
|
|
};
|
|
}
|
|
|
|
sub curry {
|
|
my $f = shift;
|
|
return sub {
|
|
my $first_arg = shift;
|
|
my $r = sub { $f->($first_arg, @_) };
|
|
return @_ ? $r->(@_) : $r;
|
|
};
|
|
}
|
|
|
|
1;
|
|
|
|
|
|
## Chapter 7 section 2.3
|
|
|
|
sub curry_n {
|
|
my $N = shift;
|
|
my $f = shift;
|
|
my $c;
|
|
$c = sub {
|
|
if (@_ >= $N) { $f->(@_) }
|
|
else {
|
|
my @a = @_;
|
|
curry_n($N-@a, sub { $f->(@a, @_) });
|
|
}
|
|
};
|
|
}
|