Функтор, в контексте функионального программирования — это интерфейс (или тайпкласс), который может быть реализован для разных типов. Чтобы тип мог имплементировать функтор, он должен иметь кайнд
* -> *
(то есть это должен быть дженерик с одним параметром) и для него должна быть реализована функция
map
:
map :: Functor f => (a -> b) -> (f a -> f b)
Имя и сигнатура могут отличаться в зависимости от реализации, например в Haskell эта функция называется
fmap
, а в Fantasy Land сигнатура выглядит так:
map :: Functor f => f a ~> (a -> b) -> f b
Также для функции/метода
map
должны выполняться определённые законы, не буду их копировать сюда, просто оставлю ссылку:
https://github.com/fantasyland/fantasy-land#functor
Несколько примеров функторов:
Array
— map
применяет функцию к каждому элементу массива.
Future
— map
применяет функцию к значению когда оно зарезолвится.
Maybe
— map
применяет функцию к значению, если оно существует, иначе возвращает Nothing
.