next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Memoizing Sup: Clausuras Ant: Clausuras e Iteradores Err: Si hallas una errata ...

Currying

Se denomina currying (en honor al lógico americano Haskell Curry, 1900-1982) al proceso de representar una función de múltiples argumentos como una función de un sólo argumento. Por ejemplo, la función suma $x+$y es una función de dos argumentos ($x, $y), pero puede verse también como una función de un argumento $x. ¿Cómo?.

La clave esta en pensar en la función suma como una función que cuando recibe el primer argumento $x devuelve como resultado una función sub { $x+$_[0] } la cual suma a su argumento el primer argumento $x.

Ejercicio 5.16.2   En el siguiente listado se ha suprimido el cuerpo de la función curry, la cual currifica una función de mas de un argumento. Escriba el código que falta en las líneas 6-8. ¿Donde se esta haciendo uso del concepto de clausura aqui? ¿Que salidas producen las líneas 20-23? Teniendo en cuenta que $tu9 es un puntero a una función, ¿no se puede reescribir la línea 18 como my $tu9_7 = curry $tu9, 7?

$ cat -n currying.pl
 1  #!/usr/bin/perl -w
 2  use strict;
 3
 4  sub curry(&$) {
 5   # Rellene los contenidos 
 6    
 7
 8    
 9  }
10
11  sub times { $_[0]*$_[1] }
12  sub tutu  {$_[0]+$_[1]*$_[2] }
13
14  my $p4 = curry { $_[0]+$_[1] } 4;
15  my $t5 = curry { $_[0]*$_[1] } 5;
16  my $t6 = curry \&times, 6;
17  my $tu9 = curry \&tutu, 9;
18  my $tu9_7 = curry \&$tu9, 7; 
19
20  print $p4->(8),"\n";
21  print $t5->(2),"\n";
22  print $t6->(3),"\n";
23  print $tu9_7->(5),"\n";


next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Memoizing Sup: Clausuras Ant: Clausuras e Iteradores Err: Si hallas una errata ...
Casiano Rodríguez León
2006-02-21