Haskell Language
Profunctor
Поиск…
Вступление
Profunctor
это класс типов обеспечивается profunctors
пакета в Data.Profunctor
.
Подробное объяснение см. В разделе «Примечания».
Синтаксис
- dimap :: Profunctor p => (a -> b) -> (c -> d) -> pbc -> pad
- lmap :: Profunctor p => (a -> b) -> pbc -> pac
- rmap :: Profunctor p => (b -> c) -> pab -> pac
- dimap id id = id
- lmap id = id
- rmap id = id
- dimap fg = lmap f. rmap g
- lmap f = dimap f id
- rmap f = dimap id f
замечания
Профессора, как описано в документах по Hackage, «бифунтор, где первый аргумент контравариантен, а второй аргумент ковариантен».
Так что это значит? Ну, бифунтор похож на нормальный функтор, за исключением того, что он имеет два параметра вместо одного, каждый со своей собственной функцией fmap
like для отображения на нем.
Быть «ковариантным» означает, что второй аргумент для профинансора - это как нормальный функтор: его функция отображения ( rmap
) имеет сигнатуру типа Profunctor p => (b -> c) -> pab -> pac
. Он просто отображает функцию во втором аргументе.
Быть «контравариантным» делает первый аргумент немного более странным. Вместо отображения как нормального функтора его функция отображения ( lmap
) имеет сигнатуру типа Profunctor p => (a -> b) -> pbc -> pac
. Это, казалось бы, обратное отображение имеет наибольшее значение для входов в функцию: вы должны запустить a -> b
на входе, а затем свою другую функцию, оставив новый вход как a
.
Примечание: Именование для нормального функтора с одним аргументом немного вводит в заблуждение: класс-указатель Functor
реализует «ковариантные» функторы, а «контравариантные» функторы реализуются в Contravariant
классе типов в Data.Functor.Contravariant
и ранее (ошибочно названный) Cofunctor
стеллаж в Data.Cofunctor
.
(->) Profunctor
(->) - простой пример профинансора: левый аргумент является входом в функцию, а правый аргумент совпадает с аргументом функтора-читателя.
instance Profunctor (->) where
lmap f g = g . f
rmap f g = g . g