Sto imparando le candidature di Haskell. Mi sembra (probabilmente sbaglio) che la pure
funzione non sia realmente necessaria, ad esempio:
pure (+) <*> [1,2,3] <*> [3,4,5]
può essere scritto come
(+) <$> [1,2,3] <*> [3,4,5]
Qualcuno può spiegare il vantaggio che la pure
funzione offre sulla mappatura esplicita con fmap
?
pure
permette di usare valori "puri" in un calcolo Applicativo. Mentre, come si osserva in modo corretto, pure f <*> x
è lo stesso che f <$> x
, non esiste un'equivalente per, diciamo, f <*> x <*> pure y <*> z
. (Almeno non la penso così.)
Monoid
classe importante - in cui pure
corrisponde Monoid
all'elemento identità. (Ciò suggerisce che Applicative
senza pure
potrebbe essere interessante, poiché Semigroup
- che è un Monoid
senza necessariamente avere un'identità - viene ancora utilizzato. In realtà, ora ci penso, mi sembra di ricordare che PureScript abbia esattamente una tale pure
classe "Applicativo senza ", anche se so a cosa serve.)
fmap (\f' x' z' -> f' x' y z') f <*> x <*> z
, penso. L'idea è nella Applicative
documentazione come legge di "interscambio".
pure f <*> x
è esattamente lo stesso difmap f x
. Sono sicuro che c'è qualche motivo per cui èpure
stato inclusoApplicative
, ma non sono del tutto sicuro del perché.