¿Por qué tenemos map, fmap y liftM?


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

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

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

¿Por qué tenemos tres funciones diferentes que hacen esencialmente lo mismo?

Author: fredoverflow, 2011-09-18

1 answers

map existe para simplificar las operaciones en las listas y por razones históricas (ver ¿Cuál es el punto de mapa en Haskell, cuando hay fmap?).

3podría preguntarse por qué necesitamos una función de mapa separada. ¿Por qué no acaba con la corriente función de mapa de solo lista, y cambiar el nombre de fmap a map en su lugar? Bueno, esa es una buena pregunta. El el argumento habitual es que alguien que acaba de aprender Haskell, cuando usa el mapa incorrectamente, más bien ver un error sobre listas que sobre Funtores.

-- Typeclassopedia , page 20

fmap y liftM existen porque las mónadas no eran automáticamente funtores en Haskell:

El hecho de que tengamos tanto fmap como liftM es un desafortunada consecuencia del hecho de que la clase de tipo Monad no requiere un Functor ejemplo, aunque matemáticamente hablando, cada mónada es una funtor. Sin embargo, fmap y liftM son esencialmente intercambiables, ya que es un error (en un social en lugar de sentido técnico) para que cualquier tipo sea una instancia de Mónada sin ser también una instancia de Funtor.

-- Typeclassopedia , page 33

Editar: la historia de agustuss de map y fmap:

En realidad no es así como sucede. Lo que sucedió fue que el tipo de mapa se generalizó para cubrir Functor en Haskell 1.3. Es decir, en Haskell 1.3 fmap fue llamado mapa. Este cambio se revirtió en Haskell 1.4 y se introdujo fmap. La razón de este cambio era pedagógico; al enseñar Haskell a principiantes, el tipo muy general de mapa hacía que los mensajes de error fueran más difíciles de entender. En mi opinión, esta no era la forma correcta de resolver el problema.

-- ¿Cuál es el punto del mapa en Haskell, cuando hay fmap?

 81
Author: li.davidm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:44