web-dev-qa-db-fra.com

Pourquoi avons-nous map, fmap et liftM?

map :: (a -> b) -> [a] -> [b]

fmap :: Functor f => (a -> b) -> f a -> f b

liftM :: Monad m => (a -> b) -> m a -> m b

Pourquoi avons-nous trois fonctions différentes qui font essentiellement la même chose?

99
fredoverflow

map existe pour simplifier les opérations sur les listes et pour des raisons historiques (voir A quoi sert la carte dans Haskell, quand il y a fmap? ).

Vous pourriez vous demander pourquoi nous avons besoin d'une fonction de carte distincte. Pourquoi ne pas simplement supprimer la fonction de carte actuelle de liste uniquement et renommer fmap en carte à la place? Eh bien, c'est une bonne question. L'argument habituel est que quelqu'un qui apprend juste Haskell, lorsqu'il utilise mal la carte, préfère de loin voir une erreur sur les listes que sur les foncteurs.

- Typeclassopedia , page 20

fmap et liftM existent parce que les monades n'étaient pas automatiquement des foncteurs dans Haskell:

Le fait que nous ayons à la fois fmap et liftM est une conséquence malheureuse du fait que la classe de type Monad ne nécessite pas d'instance Functor, même si mathématiquement parlant, chaque monade est un foncteur. Cependant, fmap et liftM sont essentiellement interchangeables, car c'est un bug (dans un sens social plutôt que technique) pour tout type d'être une instance de Monad sans être également une instance de Functor.

- Typeclassopedia , page 33

Edit: l'histoire de agustuss de map et fmap:

Ce n'est pas vraiment comme ça que ça se passe. Ce qui s'est passé, c'est que le type de carte a été généralisé pour couvrir Functor dans Haskell 1.3. C'est-à-dire que dans Haskell 1.3, fmap était appelé map. Cette modification a ensuite été annulée dans Haskell 1.4 et fmap a été introduit. La raison de ce changement était pédagogique; lors de l'enseignement de Haskell aux débutants, le type très général de carte rendait les messages d'erreur plus difficiles à comprendre. À mon avis, ce n'était pas la bonne façon de résoudre le problème.

- Quel est l'intérêt de la carte dans Haskell, quand il y a fmap?

90
li.davidm