2015-03-24 9 views
13

In ScalazE 'solo una coincidenza che Kleisli, ReaderT, e Reader sono gli stessi in Scalaz

  • Kleisli[F, A, B] è un wrapper per A => F[B].
  • ReaderT[F, A, B] - reader monad transformer - è solo uno pseudonimo di Kleisli[F, A, B].
  • Reader[A, B] monade è una specializzazione di ReaderT con l'identità monade Id:
    type Reader[A, B] = ReaderT[Id, A, B].

E 'solo una coincidenza o ci sono alcune profondo ragioni che Kleisli, ReaderT, e Reader sono isomorfi in Scalaz?

+2

Reader e ReaderT/Kleisli non sono isomorfi (come hai detto, il primo è la specializzazione di quest'ultimo). – ZhekaKozlov

+0

@ZhekaKozlov Grazie. Ho sbagliato (non aggiorno la domanda però). – Michael

risposta

21

Si può pensare che arrivi nello stesso punto da due percorsi diversi. Da un lato si inizia con il lettore monad, che è semplicemente una sorta di wrapper per le funzioni. Poi ti rendi conto che vuoi integrare questa funzionalità di lettore in una monade più grande con altri "effetti", quindi crei un trasformatore monad ReaderT. A quel punto ha senso implementare il tuo Reader[E, ?] originale come ReaderT[Id, E, ?].

Dall'altro lato, si desidera che un tipo rappresenti le frecce di Kleisli (ovvero funzioni con un tipo di ritorno monadico). Si scopre che questa è la stessa cosa di ReaderT, quindi basta fare di questo un alias.

Non c'è nulla di terribilmente misterioso nella parte "si scopre". È un po 'come se avessi iniziato con una classe di tipo Addable per cose simili al numero, poi decidi di renderla più generica, e alla fine finisca con una classe di tipo che fornisce solo un'operazione associativa di tipo "additivo". Hai reinventato lo Semigroup! Potresti comunque voler mantenere il nome Addable in giro, per motivi storici o pedagogici, o solo per comodità.

Questo è tutto ciò che sta accadendo con Reader e ReaderT -Non necessità questi alias, ma possono essere conveniente, e può contribuire a migliorare la chiarezza del codice.

+1

Puoi trovare un esempio su ciò che Travis ha spiegato qui: http://eed3si9n.com/learning-scalaz/Composing+monadic+functions.html – ssanj

Problemi correlati