Estou aprendendo os candidatos de Haskell. Parece-me (provavelmente estou errado) que a pure
funçã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 pure
função fornece sobre o mapeamento explícito fmap
?
pure
permite 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.)
Monoid
classe importante - na qual pure
corresponde ao Monoid
elemento de identidade de. (Isso sugere que Applicative
sem pure
poderia ser interessante, pois Semigroup
- que é um Monoid
sem necessariamente ter uma identidade - ainda é usado. Na verdade, agora penso nisso, me lembro que o PureScript tem exatamente uma pure
classe "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 Applicative
documentaçã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 qualpure
foi incluídoApplicative
, mas não sei por que.