Estoy aprendiendo los aplicantes de Haskell. Me parece (probablemente estoy equivocado) que la pure
función no es realmente necesaria, por ejemplo:
pure (+) <*> [1,2,3] <*> [3,4,5]
Se puede escribir como
(+) <$> [1,2,3] <*> [3,4,5]
¿Alguien puede explicar el beneficio que pure
proporciona la función sobre el mapeo explícito fmap
?
pure
permite usar, bueno, valores "puros" en un cálculo aplicativo. Si bien, como se observa correctamente, pure f <*> x
es el mismo que f <$> x
, no hay tal equivalente para, por ejemplo, f <*> x <*> pure y <*> z
. (Al menos no lo creo)
Monoid
clase importante , en la que pure
corresponde al Monoid
elemento de identidad. (Esto sugiere que Applicative
sin pure
podría ser interesante, ya Semigroup
que, que es un Monoid
sin tener necesariamente una identidad, todavía se usa. En realidad, ahora que lo pienso, parece recordar que PureScript tiene exactamente esa pure
clase de "Aplicativo sin ", aunque no no sé para qué se usa.)
fmap (\f' x' z' -> f' x' y z') f <*> x <*> z
, creo. La idea está en la Applicative
documentación como la ley del "intercambio".
pure f <*> x
es exactamente lo mismo quefmap f x
. Estoy seguro de que hay alguna razón por la quepure
se incluyóApplicative
, pero no estoy completamente seguro de por qué.