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.
fonte
2015-03-24 15:54:57
Reader e ReaderT/Kleisli non sono isomorfi (come hai detto, il primo è la specializzazione di quest'ultimo). – ZhekaKozlov
@ZhekaKozlov Grazie. Ho sbagliato (non aggiorno la domanda però). – Michael