Un poco de programación funcional
Chema Cortes
chemacortes en wanadoo.es
Mar Mar 11 10:31:07 CET 2003
Me ha picado la curiosidad con esto de la programación funcional. Tengo
algunas
ideas sobre las que me gustaría conocer vuestras opiniones.
Lo primero que quise hacer es algo parecido a un factorial hecho en Haskell:
fact n = product [1..n]
En python sería:
def fact(n):
return reduce(long.__mul__,range(1,n+1))
En una sóla línea:
fact = lambda n: reduce(long.__mul__,range(1,n+1))
El problema es que long.__mul__ requiere LongInts, y falla (no hace
conversión
automática de tipos). Aunque me gusta algo menos, utilizando el módulo
'operator':
import operator
fact = lambda n: reduce(operator.__mul__,range(1,n+1))
¿Hay alguna forma más adecuada?
Siguiendo con la programación funcional, intento realizar composición de
funciones, algo expresado así:
f · g (x) -> g(f(x))
En python se haría:
fcomp=lambda f,g: lambda *s: g(f(*s))
Una definición más robusta, en caso de emplear argumentos nominativos:
fcomp=lambda f,g: lambda *s,**k: g(f(*s,**k))
Y para una composición múltiple:
fcompm=lambda *F: reduce(fcomp,F)
o en forma más compacta:
fcompm=lambda *F: reduce(lambda f,g:lambda *s:g(f(*s)), F)
Un ejemplo práctico:
>>> filtro=fcompm(str.lower, str.strip, lambda s:s.replace("o","a"))
>>> filtro(" Hola, mundo ")
'hala, munda'
¿Sería interesante contar con el operador de composición de funciones?
¿Creéis
que se podría proponer como PEP? ¿tal vez una nueva clase/tipo para
funciones?
--
"Haz software libre, no la guerra"
Más información sobre la lista de distribución Python-es