Partout où j'ai essayé d'utiliser map
, fmap
a également fonctionné. Pourquoi les créateurs de Haskell ont-ils ressenti le besoin d'une map
fonction? Ne pourrait-il pas être simplement ce qui est actuellement connu fmap
et fmap
pourrait être supprimé de la langue?
97
fmap
sert. Il s'agit de mapper une fonction sur une instance de Functor. Je me demande quel est le but de la spécialisationmap
.Réponses:
Je voudrais faire une réponse pour attirer l'attention sur le commentaire d' Augusts :
Haskell 98 est vu comme un pas en arrière par certains Haskeller (dont moi), les versions précédentes ayant défini une bibliothèque plus abstraite et cohérente. Tant pis.
la source
map and fmap
existe depuis longtemps - il a été réchauffé sur la liste de diffusion Haskell-prime en août 2006 - haskell.org/pipermail/haskell-prime/2006-August/thread.html . En contrepoint, je préfère le statu quo. Pour moi, il me semble utile qu'il existe un sous-ensemble de Haskell qui correspond à peu près à Miranda. Au Royaume-Uni, Miranda était utilisée comme langue d'enseignement pour les étudiants en mathématiques et pas seulement pour les étudiants en informatique. Si ce créneau n'est pas déjà perdu dans un langage non fonctionnel (par exemple Mathematica), je ne vois pas Haskell avec unmap
remplissage unifié .Citant la
Functor
documentation sur https://wiki.haskell.org/Typeclassopedia#Functorla source
Ils se ressemblent sur le site de l'application, mais ils sont différents, bien sûr. Lorsque vous appliquez l'une de ces deux fonctions,
map
oufmap
à une liste de valeurs, elles produiront le même résultat, mais cela ne signifie pas qu'elles sont destinées au même objectif.Exécutez une session GHCI (Glasgow Haskell Compiler Interactive) pour rechercher des informations sur ces deux fonctions, puis jetez un œil à leurs implémentations et vous découvrirez de nombreuses différences.
carte
Interrogez GHCI pour obtenir des informations sur
map
et vous la verrez définie comme une fonction d'ordre élevé applicable à une liste de valeurs de tout type
a
donnant une liste de valeurs de tout typeb
. Bien que polymorphe (lea
etb
dans la définition ci-dessus représentent n'importe quel type), lamap
fonction est destinée à être appliquée à une liste de valeurs qui n'est qu'un type de données possible parmi beaucoup d'autres dans Haskell. Lamap
fonction n'a pas pu être appliquée à quelque chose qui n'est pas une liste de valeurs.Comme vous pouvez le lire sur le code source GHC.Base , la
map
fonction est implémentée comme suitqui utilise la correspondance de motifs pour retirer la tête (la
x
) de la queue (laxs
) de la liste, puis construit une nouvelle liste en utilisant le:
constructeur de valeur (cons) afin de la mettre en préfixef x
(lisez-la comme "f appliqué à x" ) à la récursion demap
sur la queue jusqu'à ce que la liste soit vide. Il est intéressant de noter que l'implémentation de lamap
fonction ne repose sur aucune autre fonction mais uniquement sur elle-même.fmap
Essayez maintenant de demander des informations sur
fmap
et vous verrez quelque chose de très différent.Cette heure
fmap
est définie comme l'une des fonctions dont les implémentations doivent être fournies par les types de données qui souhaitent appartenir à laFunctor
classe de types. Cela signifie qu'il peut y avoir plus d'un type de données, pas seulement le type de données "liste de valeurs" , capables de fournir une implémentation pour lafmap
fonction. Cela rendfmap
applicable à un ensemble beaucoup plus grand de types de données: les foncteurs en effet!Comme vous pouvez le lire dans le code source de GHC.Base , une implémentation possible de la
fmap
fonction est celle fournie par leMaybe
type de données:et une autre implémentation possible est celle fournie par le type de données 2-tuple
et une autre implémentation possible est celle fournie par le type de données liste (bien sûr!):
qui repose sur la
map
fonction.Conclusion
La
map
fonction peut être appliquée à rien de plus qu'une liste de valeurs (où les valeurs sont de tout type) alors que lafmap
fonction peut être appliquée à beaucoup plus de types de données: tous ceux qui appartiennent à la classe des foncteurs (par exemple, maybes, tuples, listes, etc. ). Étant donné que le type de données «liste de valeurs» est également un foncteur (car il en fournit une implémentation), alorsfmap
peut être appliqué à produit aussi bien le même résultat quemap
.la source