Sie können sich vorstellen, dass Sie auf zwei verschiedenen Routen am selben Ort ankommen. Auf der einen Seite beginnt man mit der Reader-Monade, die einfach eine Art Wrapper für Funktionen ist. Dann erkennen Sie, dass Sie diese Leser-Funktionalität in eine größere Monade mit anderen "Effekten" integrieren möchten, also erstellen Sie einen ReaderT
Monade-Transformator. An diesem Punkt ist es sinnvoll, das Original Reader[E, ?]
als ReaderT[Id, E, ?]
zu implementieren.
Auf der anderen Seite soll ein Typ Kleisli-Pfeile darstellen (d. H. Funktionen mit einem monadischen Rückgabetyp). Es stellt sich heraus, dass dies die gleiche Sache wie ReaderT
ist, so dass Sie nur einen Alias machen.
Es gibt nichts besonders mysteriöses an dem "es wird aus" Teil. Es ist ein bisschen so, als ob Sie mit einer Addable
Typklasse für numberähnliche Dinge begonnen hätten, dann entscheiden Sie sich dafür, es generischer zu machen und schließlich mit einer Typklasse zu enden, die nur eine assoziative "additionsähnliche" Operation bereitstellt. Sie haben Semigroup
neu erfunden! Sie können den Namen Addable
jedoch immer noch aus historischen oder pädagogischen Gründen oder nur aus praktischen Gründen behalten.
Das ist alles, das mit Reader
geschieht und ReaderT
-Sie nicht Notwendigkeit diese Aliase, aber sie können bequem sein, und kann helfen, die Klarheit des Codes zu verbessern.
Reader und ReaderT/Kleisli sind nicht isomorph (wie Sie gesagt haben, ist der erstere die Spezialisierung des letzteren). – ZhekaKozlov
@ZhekaKozlov Danke. Ich habe mich geirrt (wird die Frage nicht aktualisieren). – Michael