Veamos otro ejemplo de currificación. La función map
es una función de dos argumentos: el primero es código
y el segundo una lista. La función retorna una lista.
Matemáticamente:
donde
denota las funciones de
en
y
denota las listas de objetos de tipo
.
Si la currificamos la convertiremos en una función de un sólo argumento que retorna funciones:
Ası pues
- para una función
dada -
es una función que actúa sobre una lista y retorna
una lista. Podríamos usarla como sigue:
lhp@nereida:~/Lperl/src/hop/Chap7$ sed -ne '11,$p' cmap2.pl | cat -n
1 my $sizes = cmap { -s $_ };
2 my $rand20 = cmap { int(rand(20)) };
3 local $a = 0;
4 my $pref = cmap { $_ += $a; $a = $_ };
5
6 my @s = $sizes->(@ARGV);
7 my @r = $rand20->(1..5);
8 my @p = $pref->(1..5);
9
10 print "Tamaños = @s\n";
11 print "Aleatorio = @r\n";
12 print "Suma de prefijos = @p\n";
que al ejecutra resulta en:
lhp@nereida:~/Lperl/src/hop/Chap7$ cmap2.pl *.pm Tamaños = 650 1933 591 1713 Aleatorio = 18 11 1 8 12 Suma de prefijos = 1 3 6 10 15Veamos una implementación:
lhp@nereida:~/Lperl/src/hop/Chap7$ sed -ne '1,9p' cmap2.pl | cat -n
1 #!/usr/bin/perl -w
2 use strict;
3
4 sub cmap (&) {
5 my $f = shift;
6 return sub {
7 map { $f->($_) } @_
8 };
9 }
Casiano Rodríguez León
