2010-08-16 16 views
10

Ho letto un excellent introduction to monads for Clojure programmers. L'articolo illustra che la monade Identity è funzionalmente equivalente a di Clojure let e che la monade Sequence/List equivale a per.Uso per la monade identità in Clojure

Quando l'articolo raggiunge i trasformatori monad, mostra un esempio che combina le monadi Forse e Sequenza. Ok, quindi una ragione per usare una monade Sequence invece di per è che posso trasformarla. Tuttavia, trasformare una monade di identità non ha senso per me - non sarebbe sempre equivalente solo a costruire qualsiasi cosa sia la monade trasformante? Per esempio, se ho trasformato Maybe con Identity - non mi dà solo un Maybe, che sarebbe stato più facile dichiarare direttamente?

Qualcuno può chiarire se ci sia un uso pratico in Clojure per la scelta di una monade di identità nel corso di un diamo (forse non sto pensando tutto il percorso attraverso le implicazioni di trasformatori?), O è solo lì per completezza teorica?

risposta

7

Una buona ragione è che è possibile scrivere funzioni monadiche che non sono legate a una particolare monade e quindi eseguirle in un blocco with-monad. identity-m ti dà la possibilità di non coinvolgere alcun voodoo monadico speciale se scrivi (with-monad identity-m ...).

(Chiaramente, questo non funzionerà se la funzione monadica fa uso essenziale di alcune proprietà della monade con cui lavora, come la disponibilità di un getter e un setter per lo stato ecc. Non tutte le funzioni monadiche sono così, tuttavia.)

8

In effetti la monade identità è molto utile come base in un trasformatore monade. Per esempio il trasformatore forse Monade (forse-t) consente un valore altro che nil:

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 

noti che usare forse-m come monade base sarebbe scorciatoia su entrambi: sicuro e nil, invece di: fallire.

Problemi correlati