Die anderen Antworten bestätigen, dass die beiden gleich verhalten, aber nicht erklären, wo die id
tatsächlich ging. In dieser Antwort werde ich versuchen, dies zu tun. Die Pointe ist, dass wir für den Leser eine seltsame id
-Entfernungsgleichung haben: id >>= return . f = f
. (Eine schönere Form dieser Gleichung ist die (id >>=) = (>>= id)
; zusammen mit den Monadengesetzen impliziert die schöne Form die leicht verwendbare Form.) Um die Erklärung etwas einfacher zu machen, anstatt zu versuchen, von der anwendbaren Form in die monadische Form zu konvertieren, werde ich es tun nur es für selbstverständlich, dass Sie die folgende Gleichung glauben:
(==) <$> reverse <*> id
= { too annoying to do carefully }
reverse >>= \xs -> id >>= \ys -> return ((==) xs ys)
So werden wir von der letzten Zeile beginnen und bei reverse >>= (==)
beenden. Auf dem Weg wird es wichtig sein zu beobachten, dass id
ist die Identität für (.)
- die gerade so ist fmap
für den Reader Monad. Hier gehen wir:
reverse >>= \xs -> id >>= \ys -> return ((==) xs ys)
= { monad law }
reverse >>= \xs -> fmap ((==) xs) id
= { definition of fmap for Reader }
reverse >>= \xs -> (.) ((==) xs) id
= { id is the identity of fmap }
reverse >>= \xs -> (==) xs
= { eta reduction }
reverse >>= (==)
Also was bedeutet id >>= return . f = f
? Wenn wir Funktionen als "indizierte Werte" behandeln, können wir id
als den Wert verstehen, der seinem Index entspricht; und return
als der Wert, der überall gleich ist. So id >>= return . f
sagt "Blick auf Index x
; dann, (immer noch bei Index x
), geben Sie den Wert, der seinen Index ignoriert und hat den Wert f x
". Es passiert einfach, dass der Index, den wir ignorieren, und der Wert, den wir an f
übergeben, zusammenpasst - also können wir die Indirektion einfach überspringen und einfach sagen: "Schauen Sie sich den Index x
an und wenden Sie f
darauf an". Dies ist die Bedeutung der Gleichung.
https://StackOverflow.com/Questions/14430397/about-the-Function-Monad – Ryan