El siguiente ejemplo muestra una función curry
que recibe como argumento una función
y retorna una función que currifica esa función:
Cuando a la función
se le pasa un argumento
adicional
se obtiene una nueva función:
Sigue un ejemplo de uso:
15 die "Error\n" unless @ARGV;
16 my $cprod = curry(sub { $_[0]*$_[1] });
17 my $doble = $cprod->(2);
18 my @dobles = map { $doble->($_) } @ARGV;
19 print "@dobles\n";
20
21 my $cfirst = curry(\&first);
22 my $fodd = $cfirst->( sub { $_ % 2 } ); # Primer impar
23 print $fodd->(@ARGV)."\n";
lhp@nereida:~/Lperl/src$ currying2.pl 4 8 12 9 23 25
8 16 24 18 46 50
9
Veamos el código y una ejecución:
lhp@nereida:~/Lperl/src$ cat -n currying2.pl
1 #!/usr/bin/perl -w
2 use strict;
3 use List::Util qw(first);
4
5 sub curry {
6 my $f = shift; # Referencia a una función de dos o mas argumentos
7
8 return sub { # Retorna función como f pero con un arg. menos
9 my $x = shift;
10 my $fx = sub { $f->($x, @_) };
11 return $fx;
12 };
13 }
La técnica de currificación transforma una función ordinaria en una fábrica de funciones (function factory). Al llamar a la fábrica con un parámetro nos devuelve una nueva función.
curry(\&List::Util::sum)->(4)->(1..5)?
Si tiene dudas lea
la siguiente sesión con el depurador:
lhp@nereida:~/Lperl/src$ perl -wd currying2.pl main::(currying2.pl:15): die "Error\n" unless @ARGV; DB<1> $f = \&List::Util::sum DB<2> $g = curry($f) DB<3> $h = $g->(4) DB<4> x $h->(1..5) 0 19
Casiano Rodríguez León
