Ich versuche, mich mit der Anwendungs-Instanz für Reader zu befassen, indem ich die Typdefinition mit einigen Beispielen abgleiche. Ein Problem ist, dass ich nicht weiß, wie ich meinen Reader newtype verwenden soll.Wie benutze ich meinen Reader: newtype R r a = R {run :: r -> a}?
Meine Definition von Reader
newtype R r a =
R { run :: r -> a }
Die Typdefinition für (<*>)
ist
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
Specialized für den Reader-Typ wird daraus:
(<*>) :: (r -> a -> b) -> (r -> a) -> (r -> b)
Also, wenn ich versuche:
(<*>) (+) (*2) 5 -- seems equivalent to using Reader since the types match
in der REPL bekomme ich 15
. Ich denke, das ist, weil es (2*5) + 5
berechnet.
Wie würde ich das oben mit meinem Reader newtype tun? Und ist die a
Sie in (r -> a -> b)
sehen die gleiche a
Sie bekommen von (r -> a)
oder bin ich etwas missverstanden?
Sie müssen nur packen/entpacken von 'R 'bei der Definition Ihrer' Applicative' -Instanz: '(R f) <*> (R a) = R (\ r -> (fr) (ar))' – Carsten
Falls Sie die Instanz * bereits * haben, müssen Sie die Funktion umbrechen/Werte in 'R' und dann können Sie' run' verwenden: 'run (R (+) <*> R (* 2)) 5' – Carsten
Ich denke, meine Frage war nicht die klarste. Das ist, was ich mich gefragt habe, wird upvote, wenn Sie das als Antwort hinzufügen. Könnte Sie bitten, eine Follow-up-q auf der applicative Instanz obwohl. –