Esto es más o menos cómo entiendo las monads en este momento en el
contexto de Python (puedo estar meando muy afuera del tarro); no tiene
nada que ver con falta de side effects, ni (a menos que uno quiera)
con teoría de categorías. La idea básica es que cuando uno hace f(x),
en vez de que f tenga inicialmente el control de la ejecución, lo
tenga x.
Receta pava para agregar algo así como monads a un programa en Python:
1. Usar en las funciones que toman monads el decorador
def monad_aware(f):
def fprime(x):
return x.apply(f)
return fprime
2. Que todas las clases que sean monads tengan un método "apply(self, f)"
Un caso canónico de monads que es útil incluso en lenguajes "impuros"
con efectos secundarios es implementar el concepto de valor no
definido (que no necesariamente quiere decir None, o al menos no en
estos días, cuando None se usa para muchas cosas distintas). Sacando
algunos métodos auxiliares, uno pueda implementar eso usando el
decorador monad_aware, y con una clase Maybe que tenga el método
def apply(self, f):
if not self.is_defined:
return Maybe()
else:
return Maybe(f(self.value))
Maybe() genera el valor no definido. Lo que esto hace, por supuesto,
es que cualquier función f(x) devuelva "no definido" si x no está
definido, y f(x) si está definido. El código completo (todavía pavo)
está en
http://pastebin.com/f7bd884d3 .
Hay otras maneras de agregar esta semántica de valores no definidos,
claro (e.g., con otro decorador), pero lo potencialmente copado es que
uno puede hacer a las funciones monad_aware solo una vez, y darle a
las monads comportamientos arbitrariamente interesantes (logeo,
seguridad, "read-once values", constraints arbitrarios, variables
encriptadas, o lo que sea), sin tener que modificar o redecorar
funciones. Visto por el otro lado, una mónad decora automáticamente
cualquier función que la tiene como parámetro.
(Ejercicio para el lector: extender el decorador a funciones con
parámetros arbitrarios.)
Una pregunta: ¿es posible decorar funciones "por default" de una
manera más o menos elegante? Por ejemplo, hacer algo de manera tal que
a toda función que uno defina se le aplique automáticamente el
decorador monad_aware. (No digo que sea una buena idea hacerlo, o
siquiera que quiera hacerlo, pero al menos desde un punto de vista
teórico, la posibilidad de hackear de manera más implícita el
mecanismo de aplicación de funciones suena bastante interesante.)
Marcelo
---------------------------------------------------------------------
Para dar de baja la suscripcion, mande un mensaje a:
pyar-unsubscribe@???
Para obtener el resto de direcciones-comando, mande un mensaje a:
pyar-help@???
PyAr - Python Argentina - Sitio web:
http://www.python.com.ar/