Я нахожу все чаще и чаще делать что-то подобное ...haskell fmap. БПМЖ функция, функция над двумя функторов
У меня есть функция f :: IO [a]
, то я хочу, чтобы применить на ней функцию типа g :: a -> b
, чтобы получить IO [b]
.
Долгий путь:
x <- f
let y = fmap g x
который я затем укорачивается до:
x <- f
let y = g <$> x
и в настоящее время я предпочитаю делать:
y <- fmap g <$> f
, но затем с Functor
законами, я что я могу сделать даже:
(<$$>) = fmap . fmap
y <- g <$$> f
И хотя я часто видел упоминания об этом fmap . fmap
Я вижу, что у него нет специальной привязки в базовой библиотеке, хотя для меня это кажется очень частым идиомом. Я буквально мог использовать это повсюду! Так что теперь я задаюсь вопросом: неужели я недостаточно стараюсь писать чистый код, и именно поэтому я ударил этого более, чем более опытных программистов из haskell ... Или есть более элегантный способ добиться этого, что объясняет, почему эта идиома не используется другими много?
Я согласен с вашим непопулярным мнением. – mb14
Ваш аргумент, что 'IO' и' [] 'не связаны логически, имеет для меня большой смысл. Но считаете ли вы тогда, что, когда два функтора фактически логически связаны, добавление '(<$$>) = fmap.fmap' имеет смысл? Например, в 'toUpper <$$> [" abc "," cde "]' –