2015-03-24 4 views
13

In ScalazIst es nur ein Zufall, dass Kleisli, ReaderT und Reader sind gleich in Scalaz

  • Kleisli[F, A, B] ein Wrapper für A => F[B] ist.
  • ReaderT[F, A, B] - Reader Monade Transformator - ist nur ein Alias ​​von Kleisli[F, A, B].
  • Reader[A, B] Monade ist eine Spezialisierung von ReaderT mit Identität Monade Id:
    type Reader[A, B] = ReaderT[Id, A, B].

Ist es nur ein Zufall, oder gibt es einige tiefer Gründe dafür, dass Kleisli, ReaderT und Reader isomorph sind in Scalaz?

+2

Reader und ReaderT/Kleisli sind nicht isomorph (wie Sie gesagt haben, ist der erstere die Spezialisierung des letzteren). – ZhekaKozlov

+0

@ZhekaKozlov Danke. Ich habe mich geirrt (wird die Frage nicht aktualisieren). – Michael

Antwort

21

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.

+1

Sie können ein Beispiel dafür finden, was Travis hier erklärt: http://eed3si9n.com/learning-scalaz/Composing+monadic+functions.html – ssanj

Verwandte Themen