Sto imparando le candidature di Haskell. Mi sembra (probabilmente sbaglio) che la purefunzione 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 purefunzione offre sulla mappatura esplicita con fmap?
purepermette 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ì.)
Monoidclasse importante - in cui purecorrisponde Monoidall'elemento identità. (Ciò suggerisce che Applicativesenza purepotrebbe essere interessante, poiché Semigroup- che è un Monoidsenza necessariamente avere un'identità - viene ancora utilizzato. In realtà, ora ci penso, mi sembra di ricordare che PureScript abbia esattamente una tale pureclasse "Applicativo senza ", anche se so a cosa serve.)
fmap (\f' x' z' -> f' x' y z') f <*> x <*> z, penso. L'idea è nella Applicativedocumentazione come legge di "interscambio".
pure f <*> xè esattamente lo stesso difmap f x. Sono sicuro che c'è qualche motivo per cui èpurestato inclusoApplicative, ma non sono del tutto sicuro del perché.