TL; DR
Sie sind gleich.
Einige Geschichtsunterricht
State
, Writer
und Reader
wurden inspiriert von Mark P. Jones' Functional Programming with Overloading and Higher-Order Polymorphism, wo er Reader
wie folgt definiert:
A Reader
Monade verwendet wird, eine Berechnung für den Zugriff zu ermöglichen, Die Werte wurden in einigen umschließenden Umgebung gehalten (dargestellt durch den Typ r
in den folgenden Definitionen).
> instance Monad (r->) where
> result x = \r -> x
> x `bind` f = \r -> f (x r) r
als vorübergehender Kommentar, ist es interessant, dass diese beiden Funktionen nur die Standard-K
und S
combinators kombinatorischer Logik sind zu beachten.
Später legt er (fast) der heutigen MonadReader
:
Reader monads
: Eine Klasse von Monaden für Berechnungen beschreiben, die einige feste Umgebung konsultieren:
> class Monad m => ReaderMonad m r where
> env :: r -> m a -> m a
> getenv :: m r
> instance ReaderMonad (r->) r where
> env e c = \_ -> c e
> getenv = id
getenv
einfach ist ask
und env
ist local . const
. Daher enthielt diese Definition bereits alle wesentlichen Teile eines Reader
. Letztlich definiert Jones den monadisch Transformator ReaderT
(BComp
ist rückwärts Zusammensetzung):
Um damit zu beginnen, ist es nützlich, zwei verschiedene Formen der Zusammensetzung zu definieren; vorwärts (FComp
) und nach hinten (BComp
):
> data FComp m n a = FC (n (m a))
> data BComp m n a = BC (m (n a))
> type ReaderT r = BComp (r ->)
Da StateT
, WriterT
, und andere hatten ihre nicht-Transformator Variante [Functor, Monad und OUTOF Instanzen Weglassen] Es war nur logisch, ein Reader r
, das ist wirklich das gleiche wie (->) r
.
So oder so, heute Reader
, Writer
und State
sind hinsichtlich ihrer Transformatorvariante definiert, und Sie verwenden, um ihre jeweiligen Monad*
typeclass (MonadReader
).
Fazit
So sind sie in allen Verwendungen austauschbar?
Ja.
Und was ist die tatsächliche Bedeutung der Unterscheidung dieser beiden Monaden?
Keine, außer die ReaderT
tatsächlich eine Monade Transformator ist, die Dinge einfacher macht.
mögliche Duplikate von [Gibt es einen "Standard" Weg, die Äquivalenz von Reader und einer normalen Funktion zu nutzen?] (Http://stackoverflow.com/questions/28613651/is-there-any-standard-way-to -utilize-the-equivalent-of-reader-and-a-normal-fu) –
Kurz gesagt, es geht darum, 'do' Notation und' >> = 'zu verwenden. Sie können einen Parameter in den Kontext bringen, anstatt ihn explizit zu übergeben: 'f >> = g >> = h 'vs' f a. g a. h a'. Die zugrunde liegende Mechanik ist dieselbe. –
Sie können Do-Notation auch mit dem normalen Pfeiltyp verwenden, da die Instanz von 'Monad' – user3585010