Data.Functor.Contravariant
| Авторские права | (C) 2007-2015 Edward Kmett |
|---|---|
| Лицензия | в стиле BSD (см. файл LICENSE) |
| Сопровождающий | libraries@haskell.org |
| Стабильность | предварительная |
| Переносимость | переносимая |
| Безопасный Haskell | Доверенный |
| Язык | Haskell2010 |
Описание
Contravariant функторы, иногда в обиходе называемые Cofunctor, хотя двойственный объект для Functor — это просто Functor. Как и в случае с Functor, определение Contravariant для заданного ADT однозначно.
Начиная с: base-4.12.0.0
Контравариантные функторы
class Contravariant (f :: Type -> Type) where Источник
Класс контравариантных функторов.
Если в Haskell можно считать, что Functor содержит или производит значения, то контравариантный функтор — это функтор, который можно представить как потребляющий значения.
В качестве примера рассмотрим тип функций-предикатов a -> Bool. Одним из таких предикатов может быть negative x = x < 0, который определяет, являются ли целые числа отрицательными. Однако этот предикат можно повторно использовать в других ситуациях, если у нас есть способ преобразовать значения в целые числа. Например, мы можем применить предикат negative к банковскому балансу человека и выяснить, использует ли он в данный момент овердрафт:
newtype Predicate a = Predicate { getPredicate :: a -> Bool }
instance Contravariant Predicate where
contramap :: (a' -> a) -> (Predicate a -> Predicate a')
contramap f (Predicate p) = Predicate (p . f)
| `- First, map the input...
`----- then apply the predicate.
overdrawn :: Predicate Person
overdrawn = contramap personBankBalance negative
Каждый экземпляр должен удовлетворять следующим законам:
Обратите внимание: второй закон следует из свободной теоремы для типа contramap и первого закона, поэтому достаточно проверить выполнение первого условия.
Минимальное полное определение
Экземпляры
phantom :: (Functor f, Contravariant f) => f a -> f b Исходный код
Если f является одновременно Functor и Contravariant, то с учётом законов каждого из этих классов он фактически не может осмысленно использовать свой аргумент.
Этот метод на удивление полезен. Если существуют оба экземпляра и они корректны, выполняются следующие законы:
fmap f ≡ phantom contramap f ≡ phantom
Операторы
(>$<) :: Contravariant f => (a -> b) -> f b -> f a infixl 4 Исходный код
Это инфиксный псевдоним для contramap.
(>$$<) :: Contravariant f => f b -> (a -> b) -> f a infixl 4 Исходный код
Это инфиксная версия contramap с переставленными аргументами.
($<) :: Contravariant f => f b -> b -> f a infixl 4 Исходный код
Это >$ с переставленными аргументами.
Предикаты
newtype Predicate a Исходный код
Конструкторы
| Predicate | |
Поля
| |
Экземпляры
| Contravariant Predicate Исходный код |
Без новых типов contramap :: (a' -> a) -> (Predicate a -> Predicate a') contramap f (Predicate g) = Predicate (g . f) |
Определено в Data.Functor.Contravariant Методыcontramap :: (a' -> a) -> Predicate a -> Predicate a' Исходный код (>$) :: b -> Predicate b -> Predicate a Исходный код | |
| Monoid (Predicate a) Исходный код |
mempty :: Predicate a mempty = _ -> True |
Определено в Data.Functor.Contravariant Методыmempty :: Predicate a Исходный код mappend :: Predicate a -> Predicate a -> Predicate a Исходный код mconcat :: [Predicate a] -> Predicate a Исходный код | |
| Semigroup (Predicate a) Исходный код |
(<>) :: Predicate a -> Predicate a -> Predicate a Predicate pred <> Predicate pred' = Predicate a -> pred a && pred' a |
Определено в Data.Functor.Contravariant Методы(<>) :: Predicate a -> Predicate a -> Predicate a Исходный код sconcat :: NonEmpty (Predicate a) -> Predicate a Исходный код stimes :: Integral b => b -> Predicate a -> Predicate a Исходный код | |
Сравнения
newtype Comparison a Исходный код
Задаёт полный порядок на типе согласно compare.
Типы не проверяют выполнение этого условия. Вы должны самостоятельно убедиться, что переданные значения задают допустимые полные порядки.
Конструкторы
| Comparison | |
Поля
| |
Экземпляры
| Contravariant Comparison Исходный код |
|
Определено в Data.Functor.Contravariant Методыcontramap :: (a' -> a) -> Comparison a -> Comparison a' Исходный код (>$) :: b -> Comparison b -> Comparison a Исходный код | |
| Monoid (Comparison a) Исходный код |
mempty :: Comparison a mempty = Comparison _ _ -> EQ |
Определено в Data.Functor.Contravariant Методыmempty :: Comparison a Исходный код mappend :: Comparison a -> Comparison a -> Comparison a Исходный код mconcat :: [Comparison a] -> Comparison a Исходный код | |
| Semigroup (Comparison a) Исходный код |
(<>) :: Comparison a -> Comparison a -> Comparison a Comparison cmp <> Comparison cmp' = Comparison a a' -> cmp a a' <> cmp a a' |
Определено в Data.Functor.Contravariant Методы(<>) :: Comparison a -> Comparison a -> Comparison a Исходный код sconcat :: NonEmpty (Comparison a) -> Comparison a Исходный код stimes :: Integral b => b -> Comparison a -> Comparison a Исходный код | |
defaultComparison :: Ord a => Comparison a Исходный код
Сравнение с помощью compare.
Отношения эквивалентности
newtype Equivalence a Исходный код
Этот тип данных представляет отношение эквивалентности.
Предполагается, что отношения эквивалентности удовлетворяют трём законам:
- Рефлексивность
getEquivalence f a a = True- Симметричность
getEquivalence f a b = getEquivalence f b a- Транзитивность
- Если
getEquivalence f a bиgetEquivalence f b cоба являютсяTrue, то таким же является иgetEquivalence f a c.
Одни лишь типы не обеспечивают соблюдение этих законов, поэтому вам придётся проверять их самостоятельно.
Конструкторы
| Equivalence | |
Поля
| |
Экземпляры
| Contravariant Equivalence Исходный код | Отношения эквивалентности являются |
Определено в Data.Functor.Contravariant Методыcontramap :: (a' -> a) -> Equivalence a -> Equivalence a' Исходный код (>$) :: b -> Equivalence b -> Equivalence a Исходный код | |
| Monoid (Equivalence a) Исходный код |
mempty :: Equivalence a mempty = Equivalence _ _ -> True |
Определено в Data.Functor.Contravariant Методыmempty :: Equivalence a Исходный код mappend :: Equivalence a -> Equivalence a -> Equivalence a Исходный код mconcat :: [Equivalence a] -> Equivalence a Исходный код | |
| Semigroup (Equivalence a) Исходный код |
(<>) :: Equivalence a -> Equivalence a -> Equivalence a Equivalence equiv <> Equivalence equiv' = Equivalence a b -> equiv a b && equiv' a b |
Определено в Data.Functor.Contravariant Методы(<>) :: Equivalence a -> Equivalence a -> Equivalence a Исходный код sconcat :: NonEmpty (Equivalence a) -> Equivalence a Исходный код stimes :: Integral b => b -> Equivalence a -> Equivalence a Исходный код | |
defaultEquivalence :: Eq a => Equivalence a Исходный код
Проверка эквивалентности с помощью ==.
Примечание: Экземпляры для Double и Float нарушают рефлексивность для NaN.
comparisonEquivalence :: Comparison a -> Equivalence a Исходный код
Двойственные стрелки
newtype Op a b Исходный код
Двойственные функциональные стрелки.
Экземпляры
| Category Op Источник | |
| Contravariant (Op a) Источник | |
| Monoid a => Monoid (Op a b) Источник |
mempty :: Op a b mempty = Op _ -> mempty |
| Semigroup a => Semigroup (Op a b) Источник |
(<>) :: Op a b -> Op a b -> Op a b Op f <> Op g = Op a -> f a <> g a |
| Floating a => Floating (Op a b) Источник | |
Определено в Data.Functor.Contravariant Методыexp :: Op a b -> Op a b Источник log :: Op a b -> Op a b Источник sqrt :: Op a b -> Op a b Источник (**) :: Op a b -> Op a b -> Op a b Источник logBase :: Op a b -> Op a b -> Op a b Источник sin :: Op a b -> Op a b Источник cos :: Op a b -> Op a b Источник tan :: Op a b -> Op a b Источник asin :: Op a b -> Op a b Источник acos :: Op a b -> Op a b Источник atan :: Op a b -> Op a b Источник sinh :: Op a b -> Op a b Источник cosh :: Op a b -> Op a b Источник tanh :: Op a b -> Op a b Источник asinh :: Op a b -> Op a b Источник acosh :: Op a b -> Op a b Источник atanh :: Op a b -> Op a b Источник log1p :: Op a b -> Op a b Источник expm1 :: Op a b -> Op a b Источник | |
| Num a => Num (Op a b) Источник | |
Определено в Data.Functor.Contravariant | |
| Fractional a => Fractional (Op a b) Источник | |
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/9.14.1/docs/libraries/base-4.22.0.0-66f8/Data-Functor-Contravariant.html