2010-08-16 16 views
10

He estado leyendo un excellent introduction to monads for Clojure programmers. El artículo ilustra que la mónada Identity es funcionalmente equivalente a de Clojure let y que la mónada Sequence/List es equivalente a para.Uso para la mónada de identidad en Clojure

Cuando el artículo llega a los transformadores de mónada, muestra un ejemplo que combina las mónadas Maybe y Sequence. Bien, entonces una razón para usar una mónada de secuencia en lugar de para es que puedo transformarla. Sin embargo, la transformación de una mónada de identidad no tiene sentido para mí, ¿no sería eso siempre equivalente a simplemente construir lo que sea que sea la mónada transformadora? Por ejemplo, si transformé Maybe with Identity, ¿no me acaba de dar un Maybe, que hubiera sido más fácil declarar directamente?

Puede alguien aclarar si hay un uso práctico en Clojure para la elección de una mónada de identidad sobre una vamos (tal vez no estoy pensando todo el camino a través de las implicaciones de los transformadores?), O es sólo existe para la integridad teórica?

Respuesta

7

Una buena razón es que puede escribir funciones monádicas que no están vinculadas a una mónada en particular y luego ejecutarlas en un bloque with-monad. identity-m le da la opción de no incluir ningún vudú monádico especial si escribe (with-monad identity-m ...).

(Claramente, esto no funcionará si su función monádica hace un uso esencial de algunas propiedades de la mónada con la que trabaja, como la disponibilidad de un getter y un setter para estado, etc. No todas las funciones monádicas son así, sin embargo.)

8

De hecho, la mónada de identidad es muy útil como base en un transformador de mónada. Por ejemplo, el transformador puede que mónada (tal vez-t) permite un valor de nada que no sea nula:

1:2 => (use 'clojure.contrib.monads) 
nil 
1:3 => (domonad maybe-m [a 1 b 2] (+ a b)) 
3 
1:4 => (domonad maybe-m [a 1 b nil] (+ a b)) 
nil 
;; Domain uses the :fail keyword as the nil value: 
1:6 => (domonad (maybe-t identity-m :fail) [a 1 b :fail] (+ a b)) 
:fail 

Tenga en cuenta que el uso de tal m como la mónada de base tendría acceso directo en ambos: fallar y nula, en lugar de: fallar.

Cuestiones relacionadas