Поиск…


Вступление

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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow