Re: [pyar] Monads en Python

Top Page
Attachments:
+ (text/plain)
+ (text/html)

Reply to this message
Author: Manuel Aráoz
Date:  
To: pyar
Subject: Re: [pyar] Monads en Python
2010/2/4 Marcelo Rinesi <marcelo.rinesi@???>

> 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
>
>
> Muy interesante por cierto!