Стиль кодирования на Haskell: map, fmap или <$>? - PullRequest
36 голосов
/ 20 августа 2010

Есть ли какая-либо причина предпочитать одно из следующих обозначений другим или это просто вопрос предпочтения?

map toLower "FOO"

fmap toLower "FOO"

toLower <$> "FOO"

В качестве отступления: я понимаю, что <$> - это то же самое, что и `fmap`.Прав ли я в предположении, что map - это просто менее общая форма fmap?

Ответы [ 2 ]

39 голосов
/ 20 августа 2010

Как вы говорите, map - это менее общая форма fmap. Если вы знаете, что у вас есть список, то я бы использовал map, поскольку он делает код более понятным, и если вы допустите ошибку, сообщение об ошибке, вероятно, будет менее запутанным. Однако в значительной степени это вопрос предпочтения.

(<$>) совпадает с fmap. До GHC 7.10 он не был экспортирован Prelude, поэтому не был доступен по умолчанию - но даже с более старыми версиями GHC его легко импортировать из Data.Functor или Control.Applicative, и в наши дни это в значительной степени стандартный способ сделать это.

12 голосов
/ 20 августа 2010

Я согласен с Ганешей, что map более понятен для списков. Я использую <$> над fmap, если только он не применяется частично. Поэтому я бы использовал fmap reverse для объявления функции, которая обращает все элементы некоторого функтора, но если у меня есть все доступные аргументы (например, если я пишу строку в блоке do), я склонен использовать форму оператора : reverse <$> f x

...