Le altre risposte confermano che i due si comportano lo stesso, ma non spiegano dove il id
realtà andato. In questa risposta, cercherò di farlo. La battuta finale è che, per Reader, abbiamo una curiosa equazione id
-rimozione: id >>= return . f = f
. (Una forma più bella di questa equazione è quella (id >>=) = (>>= id)
, insieme con le leggi della monade la bella forma implica la forma facilmente utilizzabile.) Per rendere la spiegazione un po 'più semplice, invece di cercare di convertire dalla forma applicativa alla forma monadica, lo farò basta dare per scontato che si ritiene la seguente equazione:
(==) <$> reverse <*> id
= { too annoying to do carefully }
reverse >>= \xs -> id >>= \ys -> return ((==) xs ys)
quindi partiremo da questa ultima linea, e terminerà alle reverse >>= (==)
. Lungo la strada, sarà fondamentale osservare che id
è l'identità per (.)
- che per caso è il fmap
per la monade Reader. Andiamo:
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 >>= (==)
Quindi qual è il significato di id >>= return . f = f
? Bene, trattando le funzioni come "valori indicizzati", possiamo comprendere id
come valore uguale al suo indice; e return
come il valore che è lo stesso ovunque. Quindi id >>= return . f
dice "guarda l'indice x
, quindi, (ancora nell'indice x
), restituisce il valore che ignora il suo indice e ha valore f x
". Accade solo che l'indice che ignoriamo e il valore che abbiamo in mano a f
coincidano, quindi potremmo anche ignorare tutto ciò che è indiretto e dire semplicemente "guarda l'indice x
e applica f
ad esso". Questo è il significato dell'equazione.
fonte
2015-09-15 19:05:59
https://stackoverflow.com/questions/14430397/about-the-function-monad – Ryan