Data.Functor.Contravariant
| Авторские права | (C) 2007-2015 Edward Kmett |
|---|---|
| Лицензия | BSD-стиль (см. файл LICENSE) |
| Поддержка | libraries@haskell.org |
| Устойчивость | предварительная |
| Переносимость | переносимая |
| Safe Haskell | Надежная |
| Язык | Haskell2010 |
Описание
Contravariant функторы, иногда называемые Cofunctor, хотя дуальный Functor — это просто Functor. Как и в случае с Functor, определение Contravariant для данного АДТ однозначно.
С версии: 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 и первого закона, поэтому вам нужно только проверить, выполняется ли первое условие.
Минимальное полное определение
Примеры реализации
| Contravariant Сравнение Исходный код | A |
Определено в Data.Functor.Contravariant Методыcontramap :: (a' -> a) -> Сравнение a -> Сравнение a' Исходный код (>$) :: b -> Сравнение b -> Сравнение a Исходный код | |
| Contravariant Эквивалентность Исходный код | Отношения эквивалентности являются |
Определено в Data.Functor.Contravariant Методыcontramap :: (a' -> a) -> Эквивалентность a -> Эквивалентность a' Исходный код (>$) :: b -> Эквивалентность b -> Эквивалентность a Исходный код | |
| Contravariant Предикат Исходный код |
A Без newtypes contramap :: (a' -> a) -> (Predicate a -> Predicate a') contramap f (Predicate g) = Predicate (g . f) |
Определено в Data.Functor.Contravariant Методыcontramap :: (a' -> a) -> Предикат a -> Предикат a' Исходный код (>$) :: b -> Предикат b -> Предикат a Исходный код | |
| Contravariant (Оператор a) Исходный код | |
Определено в Data.Functor.Contravariant Методыcontramap :: (a' -> a0) -> Оператор a a0 -> Оператор a a' Исходный код (>$) :: b -> Оператор a b -> Оператор a a0 Исходный код | |
| Contravariant (Прокси :: Тип -> Тип) Исходный код | |
Определено в Data.Functor.Contravariant Методыcontramap :: (a' -> a) -> Прокси a -> Прокси a' Исходный код (>$) :: b -> Прокси b -> Прокси a Исходный код | |
| Contravariant (U1 :: Тип -> Тип) Исходный код | |
Определено в Data.Functor.Contravariant | |
| Contravariant (V1 :: Тип -> Тип) Исходный код | |
Определено в Data.Functor.Contravariant | |
| Contravariant (Const a :: Type -> Type) Source | |
| Contravariant f => Contravariant (Alt f) Source | |
| Contravariant f => Contravariant (Rec1 f) Source | |
| (Contravariant f, Contravariant g) => Contravariant (Product f g) Source | |
| (Contravariant f, Contravariant g) => Contravariant (Sum f g) Source | |
| (Contravariant f, Contravariant g) => Contravariant (f :*: g) Source | |
| (Contravariant f, Contravariant g) => Contravariant (f :+: g) Source | |
| Contravariant (K1 i c :: Type -> Type) Source | |
| (Functor f, Contravariant g) => Contravariant (Compose f g) Source | |
| (Functor f, Contravariant g) => Contravariant (f :.: g) Source | |
| Contravariant f => Contravariant (M1 i c f) Source | |
phantom :: (Functor f, Contravariant f) => f a -> f b Source
Если f является одновременно Functor и Contravariant, то, учитывая законы каждого из этих классов, он фактически не может использовать свой аргумент осмысленным образом.
Этот метод удивительно полезен. Когда существуют оба экземпляра и они корректны, мы имеем следующие законы:
fmap f ≡ phantom contramap f ≡ phantom
Операторы
(>$<) :: Contravariant f => (a -> b) -> f b -> f a infixl 4 Source
Это инфиксное алиас для contramap.
(>$$<) :: Contravariant f => f b -> (a -> b) -> f a infixl 4 Source
Это инфиксная версия contramap с переставленными аргументами.
($<) :: Contravariant f => f b -> b -> f a infixl 4 Source
Это >$ с переставленными аргументами.
Предикаты
Конструкторы
| Predicate | |
Поля
| |
Примеры использования
| Contravariant Predicate Исходный код |
A Без newtypes 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 Исходный код | A |
Определено в Data.Functor.Contravariant Методыcontramap :: (a' -> a) -> Comparison a -> Comparison a' Исходный код (>$) :: b -> Comparison b -> Comparison a Исходный код | |
| Моноид (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 Исходный код | |
| Полугруппа (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 :: Целое 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 Исходный код
Двойные функциональные стрелки.
Примеры использования
| Категория Op Исходный код | |
Определено в Data.Functor.Contravariant | |
| Контравариантный (Op a) Исходный код | |
Определено в Data.Functor.Contravariant Методыcontramap :: (a' -> a0) -> Op a a0 -> Op a a' Исходный код (>$) :: b -> Op a b -> Op a a0 Исходный код | |
| Моноид a => Моноид (Op a b) Исходный код |
mempty :: Op a b mempty = Op _ -> mempty |
Определено в Data.Functor.Contravariant Методыmempty :: Op a b Исходный код mappend :: Op a b -> Op a b -> Op a b Исходный код mconcat :: [Op a b] -> Op a b Исходный код | |
| Полугруппа a => Полугруппа (Op a b) Исходный код |
(<>) :: Op a b -> Op a b -> Op a b Op f <> Op g = Op a -> f a <> g a |
Определено в Data.Functor.Contravariant Методы(<>) :: Op a b -> Op a b -> Op a b Исходный код sconcat :: Непустой список (Op a b) -> Op a b Исходный код stimes :: Целочисленный b0 => b0 -> Op a b -> Op a b Исходный код | |
| Число с плавающей точкой a => Число с плавающей точкой (Op a b) Исходный код | |
Определено в Data.Functor.Contravariant Краткое описание методовexp :: Op a b -> Op a b Source log :: Op a b -> Op a b Source sqrt :: Op a b -> Op a b Source (**) :: Op a b -> Op a b -> Op a b Source logBase :: Op a b -> Op a b -> Op a b Source sin :: Op a b -> Op a b Source cos :: Op a b -> Op a b Source tan :: Op a b -> Op a b Source asin :: Op a b -> Op a b Source acos :: Op a b -> Op a b Source atan :: Op a b -> Op a b Source sinh :: Op a b -> Op a b Source cosh :: Op a b -> Op a b Source tanh :: Op a b -> Op a b Source asinh :: Op a b -> Op a b Source acosh :: Op a b -> Op a b Source atanh :: Op a b -> Op a b Source log1p :: Op a b -> Op a b Source expm1 :: Op a b -> Op a b Source | |
| Num a => Num (Op a b) Source | |
Определено в Data.Functor.Contravariant Методы(+) :: Op a b -> Op a b -> Op a b Исходный код (-) :: Op a b -> Op a b -> Op a b Исходный код (*) :: Op a b -> Op a b -> Op a b Исходный код negate :: Op a b -> Op a b Исходный код abs :: Op a b -> Op a b Исходный код signum :: Op a b -> Op a b Исходный код fromInteger :: Integer -> Op a b Исходный код | |
| Fractional a => Fractional (Op a b) Исходный код | |
Определено в Data.Functor.Contravariant Методы(/) :: Op a b -> Op a b -> Op a b Исходный код recip :: Op a b -> Op a b Исходный код fromRational :: Rational -> 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.12.1/docs/libraries/base-4.21.0.0-8e62/Data-Functor-Contravariant.html