Ich lese Purescript von Beispiel und kam zu dem Teil Einführung der Reader Monad. Das Beispiel geht so:Verständnis der Reader Monad
createUser :: Reader Permissions (Maybe User)
createUser = do
permissions <- ask
if hasPermission "admin" permissions
then map Just newUser
else pure Nothing
Das verwirrende Teil ist für mich die ask
Funktion. Die Signatur ist:
ask :: forall r. Reader r r
Es scheint, als ob es einen Leser aus der Luft erzeugt
Wenn ich über die State
Monade las, es das gleiche Konzept mit seiner get
Funktion hatte. Und der Text erklärt:
der Zustand wird als ein Funktionsargument implementiert, das durch den Datenkonstruktor der Zustands-Monade versteckt wird, also gibt es keinen ausdrücklichen Hinweis, um herumzugehen.
Ich vermute, dies ist der Schlüssel, und gleiche geschieht hier mit dem Reader, aber ich verstehe nicht, wie es funktioniert ...
Wenn das obige Beispiel laufen über runReader
, wie erscheint plötzlich der angegebene Wert als Ergebnis von ask
? Die Haskell-Dokumente für ask
sagen: Ruft die Monad-Umgebung ab. Aber meine Verwirrung ist von wo? So wie ich es sehe, wird ein Wert an runReader
übergeben, wird irgendwo gespeichert, und um es zu bekommen - rufen Sie ask
... aber das macht keinen Sinn.
Während das Beispiel Purescript ist, nehme ich an, dass jede Haskell-fähige Person auch antworten könnte, daher der Haskell-Tag.
'Reader ein b' ist ein Wrapper um' a -> b '. Also, fragen Sie :: Forall a. Reader a a' ist letztlich nur ein Wert des Typs 'forall a. a -> a', mit einer Umhüllung. –