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
