2016-09-07 3 views
4

Warum gibt es in Control.Monad.Reader eine Reader-Monade und eine MonadReader-Monade? Die Paketdokumentation spricht über die Reader-Monade und startet dann ohne weitere Erläuterungen direkt in die MonadReader-Dokumentation. Was ist der Unterschied zwischen diesen Monaden? Das Lesen dieser Referenzseiten lässt mich mehr als verwirrt. Interessanterweise muss die Reader Monad Seite für das Haskell Wikibook noch geschrieben werden!Reader und MonadReader

+0

Wie ich verstehe, ist dies eine Abstraktion über alles, was sich wie "Reader" Monade verhalten könnte. Zum Beispiel könnte es ein Stapel von Monadetransformatoren sein. Bitte korrigieren Sie mich, falls ich falsch liege. – wowofbob

Antwort

11

Es gibt keine MonadReader Monade. Das ist eine Klasse von Monaden, nämlich von jenen Monaden, die als a Reader verwendet werden können (im Allgemeinen, weil sie als ein Monadetransformatorstapel mit einem ReaderT irgendwo definiert werden). So

  • Reader ist die spezifische Monade, dass nur wirkt als Leser, weil es ReaderT nur auf die triviale Identität Monade angewendet hat:

    type Reader r = ReaderT r Identity 
    

    Es ist also offensichtlich eine Instanz von MonadReader , tut aber nichts anderes.

  • MonadReader ist die Klasse alle Monaden, die aus irgendeiner Umgebung lesen können. Auch dies beinhaltet Reader selbst, aber auch MaybeT (ReaderT Int (ListT IO)).