2010-08-20 14 views
36

¿Hay alguna razón para preferir una de las siguientes notaciones sobre las demás o es simplemente una cuestión de preferencia?

map toLower "FOO" 

fmap toLower "FOO" 

toLower <$> "FOO" 

Como acotación al margen: Soy consciente de que <$> es lo mismo que `fmap`. ¿Estoy en lo cierto al suponer que map es solo una forma menos general de fmap?

Respuesta

39

Como dices, map es una forma menos general de fmap. Si sabe que tiene una lista, entonces usaría map ya que hace que el código sea más claro y si comete un error, es probable que el mensaje de error sea menos confuso. Sin embargo, en gran medida es una cuestión de preferencia.

(<$>) es igual que fmap. Hasta GHC 7.10 no fue exportado por el Preludio, por lo que no estaba disponible por defecto, pero incluso con versiones anteriores de GHC, es fácil de importar desde Data.Functor o Control.Applicative y en estos días es prácticamente la forma estándar de hacerlo.

+15

Y 'liftM' es lo mismo que' fmap', excepto que está sobrecargado en 'Monad' en lugar de' Functor'. –

+2

[** 'liftA' **] (http://hackage.haskell.org/package/base-4.7.0.1/docs/Control-Applicative.html#liftA) también, generalizado para [**' Applicative' ** Functors] (http://hackage.haskell.org/package/base-4.7.0.1/docs/Control-Applicative.html) –

+0

'<$>' es exportado por el preludio en versiones recientes. – fphilipe

12

Estoy de acuerdo con Ganesh en que map es más claro para las listas. Uso <$> sobre fmap, a menos que esté parcialmente aplicado. Entonces usaría fmap reverse para declarar una función que revierte todos los elementos de algún functor, pero si tengo todos los argumentos disponibles (por ejemplo, si estoy escribiendo una línea en un bloque do) tiendo a usar el formulario de operador: reverse <$> f x

+1

A menudo uso 'fmap' en notación infija, por ejemplo:' reverse \ 'fmap \' x', ya que 'fmap' está en el Preludio, por lo que no tengo para importar Control.Applicative. Entonces, si necesito una aplicación parcial, termino escribiendo: 'f = (reverse \' fmap \ ')' –

+1

Me parece mejor usar la función 'fmap' simple y llanamente (prefijo), pero tal vez sea solo yo ... Yo uso '<$>' cuando también estoy usando '<*>', sin embargo. – mk12

Cuestiones relacionadas