J'apprends les candidats de Haskell. Il me semble (je me trompe probablement) que la pure
fonction n'est pas vraiment nécessaire, par exemple:
pure (+) <*> [1,2,3] <*> [3,4,5]
peut être écrit comme
(+) <$> [1,2,3] <*> [3,4,5]
Quelqu'un peut-il expliquer les avantages de la pure
fonction par rapport à un mappage explicite fmap
?
haskell
applicative
Gil Shafriri
la source
la source
pure f <*> x
c'est exactement la même chose quefmap f x
. Je suis sûr qu'il y a une raison pour laquelle cela apure
été inclusApplicative
, mais je ne sais pas vraiment pourquoi.pure
permet d'utiliser, bien, des valeurs "pures" dans un calcul Applicatif. Alors que, comme vous le constatez correctement,pure f <*> x
c'est la même chose quef <$> x
, par exemple , il n'y a pas d'équivalent pourf <*> x <*> pure y <*> z
. (Au moins, je ne pense pas.)Monoid
classe importante - dans laquellepure
correspond l'Monoid
élément identitaire de. (Cela suggère queApplicative
sanspure
pourrait être intéressant, carSemigroup
- ce qui estMonoid
sans nécessairement avoir une identité - est toujours utilisé. En fait, maintenant j'y pense, il me semble que PureScript a exactement une tellepure
classe "Applicative sans ", bien que je ne sais pas à quoi il sert.)fmap (\f' x' z' -> f' x' y z') f <*> x <*> z
, je pense. L'idée est dans laApplicative
documentation comme la loi de "l'échange".Applicative
sanspure
existeApply
depuis les semi-groupes .Réponses:
Je suis à la limite de mes compétences ici, alors ne prenez pas cela plus qu'il ne l'est, mais c'était un peu trop long pour un commentaire.
Il peut y avoir des raisons pratiques à inclure
pure
dans la classe type, mais de nombreuses abstractions de Haskell sont dérivées de fondements théoriques, et je pense que c'est également le casApplicative
. Comme le dit la documentation, il s'agit d'un foncteur monoïdal laxiste puissant (voir https://cstheory.stackexchange.com/q/12412/56098 pour une élaboration). Je suppose que celapure
sert d' identité , tout comme lereturn
fait pourMonad
(qui est un monoïde dans la catégorie des endofoncteurs ).Considérez
pure
etliftA2
:Si vous plissez les yeux un peu, vous pouvez peut-être imaginer que
liftA2
c'est une opération binaire, ce qui est également ce que la documentation indique:pure
est donc l'identité correspondante.la source
Applicative
sanspure
serait un foncteur semi - groupe hm au lieu d'un foncteur monoïde.fmap
ne le coupe pas toujours. Plus précisément,pure
c'est ce qui vous permet d'introduiref
(oùf
estApplicative
) quand vous ne l'avez pas déjà. Un bon exemple estIl prend une liste «d'actions» produisant des valeurs et la transforme en une action produisant une liste de valeurs. Que se passe-t-il lorsqu'il n'y a aucune action dans la liste? Le seul résultat sain est une action qui ne produit aucune valeur:
Si ce n'était pas le cas
pure
, vous seriez obligé d'exiger une liste d'actions non vide. Vous pourriez certainement le faire fonctionner, mais c'est comme parler d'addition sans mentionner 0 ou de multiplication sans 1 (comme d'autres l'ont dit, car lesApplicative
s sont monoïdaux). Vous rencontrerez à plusieurs reprises des cas marginaux qui seraient facilement résoluspure
mais qui devraient être résolus à la place par des restrictions étranges sur vos entrées et autres pansements.la source