Data.Bifunctor
| Авторские права | (C) 2008-2014 Edward Kmett |
|---|---|
| Лицензия | BSD (см. файл LICENSE) |
| Поддержка | libraries@haskell.org |
| Устойчивость | предварительная |
| Переносимость | переносимый |
| Safe Haskell | Безопасный |
| Язык | Haskell2010 |
Описание
С момента: base-4.8.0.0
class (forall a. Functor (p a)) => Bifunctor (p :: Тип -> Тип -> Тип) where Исходный код
Бифунктор — это конструктор типов, принимающий два аргумента типа и являющийся функтором в обоих аргументах. В отличие от Functor, конструктор типа, такой как Either, не нуждается в частичном применении для Bifunctor экземпляра, а методы в этом классе позволяют отображать функции над значением Left или значением Right, или обоими одновременно.
Формально, класс Bifunctor представляет собой бифунктор от Hask -> Hask.
Интуитивно это бифунктор, где оба первого и второго аргумента являются ковариантными.
Определение класса Bifunctor p использует расширение языка QuantifiedConstraints, чтобы квантифицировать первый тип аргумента a в его контексте. Контекст требует, чтобы p a должен быть Functor для всех a. Другими словами, частично применённый Bifunctor должен быть Functor. Это делает Functor суперклассом Bifunctor, так что функция с ограничением Bifunctor может использовать fmap в своей реализации. Functor является квантифицированным суперклассом Bifunctor со времени base-4.18.0.0.
Вы можете определить Bifunctor путём определения bimap или путём определения first и second. Метод second должен совпадать с fmap:
second ≡ fmap
Из этого следует:
second id ≡ id
Если вы предоставите bimap, вы должны убедиться, что:
bimap id id ≡ id
Если вы предоставите first и second, убедитесь, что:
first id ≡ id second id ≡ id
Если вы предоставите оба, вы также должны убедиться, что:
bimap f g ≡ first f . second g
Это гарантируется параметричностью:
bimap (f . g) (h . i) ≡ bimap f h . bimap g i first (f . g) ≡ first f . first g second (f . g) ≡ second f . second g
С момента: base-4.8.0.0
Методы
bimap :: (a -> b) -> (c -> d) -> p a c -> p b d Исходный код
Отображение по обоим аргументам одновременно.
bimap f g ≡ first f . second g
Примеры
>>> bimap toUpper (+1) ('j', 3)
('J',4)
>>> bimap toUpper (+1) (Left 'j') Left 'J'
>>> bimap toUpper (+1) (Right 3) Right 4
first :: (a -> b) -> p a c -> p b c Исходный код
Отображение по ковариантному первому аргументу.
first f ≡ bimap f id
Примеры
>>> first toUpper ('j', 3)
('J',3)
>>> first toUpper (Left 'j') Left 'J'
second :: (b -> c) -> p a b -> p a c Исходный код
Отображение по ковариантному второму аргументу.
second ≡ bimap id
Примеры
>>> second (+1) ('j', 3)
('j',4)
>>> second (+1) (Right 3) Right 4
Экземпляры
| Bifunctor Arg Источник | С версии: base-4.9.0.0 |
| Bifunctor Either Источник | С версии: base-4.8.0.0 |
| Bifunctor (,) Источник |
Законы класса для кортежей выполняются только в рамках ленивости. >>> first id (undefined :: (Int, Word)) `seq` () () >>> second id (undefined :: (Int, Word)) `seq` () () >>> id (errorWithoutStackTrace "error!" :: (Int, Word)) `seq` () *** Exception: error! С версии: base-4.8.0.0 |
| Bifunctor (Const :: Type -> Type -> Type) Источник | С версии: base-4.8.0.0 |
| Bifunctor ((,,,) x1 x2) Источник | С версии: base-4.8.0.0 |
| Bifunctor (K1 i :: Type -> Type -> Type) Источник | С версии: base-4.9.0.0 |
Определено в Data.Bifunctor Методыbimap :: (a -> b) -> (c -> d) -> (x1, x2, a, c) -> (x1, x2, b, d) Исходный код first :: (a -> b) -> (x1, x2, a, c) -> (x1, x2, b, c) Исходный код second :: (b -> c) -> (x1, x2, a, b) -> (x1, x2, a, c) Исходный код | |
| Bifunctor ((,,,,) x1 x2 x3) Исходный код | С момента: base-4.8.0.0 |
Определено в Data.Bifunctor Методыbimap :: (a -> b) -> (c -> d) -> (x1, x2, x3, a, c) -> (x1, x2, x3, b, d) Исходный код first :: (a -> b) -> (x1, x2, x3, a, c) -> (x1, x2, x3, b, c) Исходный код second :: (b -> c) -> (x1, x2, x3, a, b) -> (x1, x2, x3, a, c) Исходный код | |
| Bifunctor ((,,,,,) x1 x2 x3 x4) Исходный код | С момента: base-4.8.0.0 |
Определено в Data.Bifunctor Методыbimap :: (a -> b) -> (c -> d) -> (x1, x2, x3, x4, a, c) -> (x1, x2, x3, x4, b, d) Исходный код first :: (a -> b) -> (x1, x2, x3, x4, a, c) -> (x1, x2, x3, x4, b, c) Исходный код second :: (b -> c) -> (x1, x2, x3, x4, a, b) -> (x1, x2, x3, x4, a, c) Исходный код | |
| Bifunctor ((,,,,,,) x1 x2 x3 x4 x5) Исходный код | С момента: base-4.8.0.0 |
Определено в Data.Bifunctor Методыbimap :: (a -> b) -> (c -> d) -> (x1, x2, x3, x4, x5, a, c) -> (x1, x2, x3, x4, x5, b, d) Исходный код first :: (a -> b) -> (x1, x2, x3, x4, x5, a, c) -> (x1, x2, x3, x4, x5, b, c) Исходный код second :: (b -> c) -> (x1, x2, x3, x4, x5, a, b) -> (x1, x2, x3, x4, x5, a, c) Исходный код | |
© 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-Bifunctor.html