Стиль кодировки Haskell: map, fmap или <$>?
Есть ли причина предпочесть одну из следующих обозначений над другими или это просто вопрос предпочтения?
map toLower "FOO"
fmap toLower "FOO"
toLower <$> "FOO"
В стороне: я понимаю, что <$>
совпадает с `fmap`
. Правильно ли я в предположении, что map
является лишь менее общим видом fmap
?
Ответы
Ответ 1
Как вы говорите, map
является менее общей формой fmap
. Если вы знаете, что у вас есть список, я бы использовал map
, поскольку он делает код более четким, и если вы допустили ошибку, сообщение об ошибке, вероятно, будет менее запутанным. Однако в значительной степени это вопрос предпочтения.
(<$>)
совпадает с fmap
. До тех пор, пока GHC 7.10 не был экспортирован прелюдией, поэтому он не был доступен по умолчанию - но даже с более старыми версиями GHC легко импортировать из Data.Functor
или Control.Applicative
, и в наши дни это в значительной степени стандартный способ сделать это.
Ответ 2
Я согласен с Ganesh, что map
более ясен для списков. Я использую <$>
над fmap
, если он не применяется частично. Поэтому я бы использовал fmap reverse
для объявления функции, которая меняет все элементы некоторого функтора, но если у меня есть все доступные аргументы (например, если я пишу строку в блоке do
), я, как правило, использую форму оператора: reverse <$> f x