innych odpowiedzi potwierdzają, że dwa zachowują się tak samo, ale nie wyjaśniają, gdzie id
faktycznie poszedł. W tej odpowiedzi spróbuję to zrobić. Punchlina jest taka, że dla Readera mamy ciekawy -wyjęcie równania: id >>= return . f = f
. (Bardziej piękna forma tego równania to: (id >>=) = (>>= id)
; wraz z prawami monady piękna forma oznacza łatwą do wykorzystania formę). Aby wyjaśnić nieco prostsze, zamiast próbować przekształcić z formy aplikacyjnej w formę monadyczną, po prostu przyjąć za pewnik, że wierzysz następujące równanie:
(==) <$> reverse <*> id
= { too annoying to do carefully }
reverse >>= \xs -> id >>= \ys -> return ((==) xs ys)
Więc zaczniemy od tej ostatniej linii, a kończy na reverse >>= (==)
. Po drodze będzie kluczem do zauważenia, że id
jest tożsamością dla (.)
- która tak się akurat okazała być fmap
dla monitory Reader. Oto:
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 >>= (==)
Jakie jest znaczenie id >>= return . f = f
? Cóż, traktując funkcje jako "wartości indeksowane", możemy zrozumieć, że id
jest wartością równą jej indeksowi; i return
jako wartość, która wszędzie jest taka sama. Więc id >>= return . f
mówi „patrzeć na indeks x
; następnie, (wciąż w indeksie x
) zwraca wartość, która ignoruje jej indeks i ma wartość f x
”. Tak się składa, że indeks ignorować, a wartość możemy oddać do f
meczu up - więc równie dobrze możemy pominąć cały ten zadnie i po prostu powiedzieć „spojrzeć na indeks x
i zastosować f
do niego”. To jest znaczenie równania.
https://stackoverflow.com/questions/14430397/about-the-function-monad – Ryan