Estou aprendendo os candidatos de Haskell. Parece-me (provavelmente estou errado) que a purefunção não é realmente necessária, por exemplo:
pure (+) <*> [1,2,3] <*> [3,4,5]
pode ser escrito como
(+) <$> [1,2,3] <*> [3,4,5]
Alguém pode explicar o benefício que a purefunção fornece sobre o mapeamento explícito fmap?
purepermite usar, bem, valores "puros" em uma computação Aplicativa. Enquanto, como você observa corretamente, pure f <*> xé o mesmo que f <$> x, não existe um equivalente para, digamos f <*> x <*> pure y <*> z,. (Pelo menos acho que não.)
Monoidclasse importante - na qual purecorresponde ao Monoidelemento de identidade de. (Isso sugere que Applicativesem purepoderia ser interessante, pois Semigroup- que é um Monoidsem necessariamente ter uma identidade - ainda é usado. Na verdade, agora penso nisso, me lembro que o PureScript tem exatamente uma pureclasse "Aplicativa sem ", embora eu não não sei para que serve.)
fmap (\f' x' z' -> f' x' y z') f <*> x <*> z, eu acho. A idéia está na Applicativedocumentação como a lei do "intercâmbio".
pure f <*> xé exatamente o mesmo quefmap f x. Estou certo de que há alguma razão pela qualpurefoi incluídoApplicative, mas não sei por que.