Currificar map

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:

$\displaystyle Map : \mathcal{F}(D, E) \times \mathcal{L}(D) \rightarrow \mathcal{L}(E)$    

donde $ \mathcal{F}(D, E)$ denota las funciones de $ D$ en $ E$ y $ \mathcal{L}(D)$ denota las listas de objetos de tipo $ D$ .

Si la currificamos la convertiremos en una función de un sólo argumento que retorna funciones:

$\displaystyle Cmap : \mathcal{F}(D, E) \rightarrow \mathcal{F}(\mathcal{L}(D), \mathcal{L}(E))$    

Ası pues $ Cmap(f)$ - para una función $ f$ 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 15
Veamos 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
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19