Currificación de funciones

Chema Cortés py en ch3m4.org
Mar Oct 21 21:13:28 CEST 2003


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

El Martes, 21 de Octubre de 2003 18:52, marcelino villarino aguiar escribió:

> Quiero que una función me devuelva otra función, para hacer algo así:
> def suma(x, y):
>     return x+y
>
> def función(x, y):
>     #algo, y devuelve una función
>  funcion(elevar, 5)(5) # y me devuelva 5 al cubo.
>
> intendo meter en #algo un return suma,pero no me deja, pero si asigno
> suma (la función) a una variable, puedo devolver la variable, y
> efectivamente, si lo hago, función me devuelve un objeto de tipo
> función.
>
> No hay forma de hacerlo sin la asignación intermedia?
>
> Por otro lado, podría alguien explicarme que es eso de la
> currificación?, es que estoy intentando meterle mano a Haskell, pero
> no se deja (vamos, que en las páginas en español de internet no
> encuentro nada que lo explique con nivel para diletantes.

Ambas preguntas son la misma, ya que justamente lo que estás pidiendo en la 
primera pregunta es una "currificación" :-)

"Curry" (http://www.informatik.uni-kiel.de/~mh/curry/) es un lenguaje 
funcional donde las funciones pueden "evaluarse" parcialmente aunque no se 
pasen todos los argumentos, quedando a la espera de una evaluación completa 
cuando reciba el resto de argumentos.

Como ejemplo, te pongo una solución de tu problema:

def suma(x,y):
  return x+y

def elevar(x,y):
  return x**y

#función para "currificar"
def curry(func,*args0,**kwdict0):

  def curryfunc(*args,**kwdict):
    args=args0+args
    kwdict.update(kwdict0)
    return func(*args,**kwdict)

  return curryfunc

f=curry(sumar,3)
print f(2)   #--> 5
f=curry(elevar,3)
print f(2)   #--> 9
f=curry(elevar,y=3)
print f(2)   #--> 8


Si te interesa el tema, te pongo algunos enlaces:

Toolkit Xoltar:
http://www.xoltar.org/languages/python.html

Artículos de "Charming Python":
http://www-106.ibm.com/developerworks/linux/library/l-prog.html
http://www-106.ibm.com/developerworks/linux/library/l-prog2.html
http://www-106.ibm.com/developerworks/linux/library/l-prog3.html

Recetas de python sobre currificación:
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52549
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52564
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/222061


En cuanto pueda, acabaré un articulillo sobre el tema para explicar las 
posibilidades que tiene python para la programación funcional.

En cuanto a información sobre Haskell, hay un libro en español muy bueno del 
que podría pasarte la referencia en unos días. En cuanto al Curry hay que 
destacar un grupo de trabajo de la Universidad de Valencia que está muy 
metido con él: http://www.dsic.upv.es/users/elp/elp.html

- -- 
Chema Cortes (py en ch3m4.org)
  http://py.ch3m4.org
    PGPKEY: mailto:pgpkey en ch3m4.org?subject=__PGPKEY__
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.2-rc1-SuSE (GNU/Linux)

iD8DBQE/lYVeHLTQrABk8H0RAkZpAJ48ALw3BDavYHXx1elTuY62GxtQRQCfe3s6
0uBHmg+GsjeNTnl5c7sDCn4=
=YdRT
-----END PGP SIGNATURE-----




Más información sobre la lista de distribución Python-es