Haskell Language
бифунктора
Поиск…
Синтаксис
- bimap :: (a -> b) -> (c -> d) -> pac -> pbd
- first :: (a -> b) -> pac -> pbc
- второй :: (b -> c) -> pab -> pac
замечания
Functor
мельницы Functor
ковариантен в одном типе параметра. Например, если f
является Functor
, то, учитывая fa
и функцию вида a -> b
, можно получить fb
(используя fmap
).
Bifunctor
ковариантен по двум типам параметров. Если f
- Bifunctor
, то, учитывая функцию fab
и две функции, одну из a -> c
, а другую из b -> d
, можно получить fcd
(используя bimap
).
first
следует рассматривать как fmap
по первому типу параметра, second
как fmap
над вторым, а bimap
следует понимать как ковариационное отображение двух функций по параметрам первого и второго типа соответственно.
Общие случаи Бифунтера
Двухэлементные кортежи
(,)
является примером типа, имеющего экземпляр Bifunctor
.
instance Bifunctor (,) where
bimap f g (x, y) = (f x, g y)
bimap
выполняет пару функций и применяет их к соответствующим компонентам кортежа.
bimap (+ 2) (++ "nie") (3, "john") --> (5,"johnnie")
bimap ceiling length (3.5 :: Double, "john" :: String) --> (4,4)
Either
Either
экземпляр Bifunctor
выбирает одну из двух функций для применения в зависимости от того, является ли значение « Left
или « Right
.
instance Bifunctor Either where
bimap f g (Left x) = Left (f x)
bimap f g (Right y) = Right (g y)
первый и второй
Если сопоставление ковариантно только по первому аргументу или только по второму аргументу, то нужно использовать first
или second
(вместо bimap
).
first :: Bifunctor f => (a -> c) -> f a b -> f c b
first f = bimap f id
second :: Bifunctor f => (b -> d) -> f a b -> f a d
second g = bimap id g
Например,
ghci> second (+ 2) (Right 40)
Right 42
ghci> second (+ 2) (Left "uh oh")
Left "uh oh"
Определение бифунтера
Bifunctor
- это класс типов с двумя параметрами типа ( f :: * -> * -> *
), оба из которых могут ковариантно отображаться одновременно.
class Bifunctor f where
bimap :: (a -> c) -> (b -> d) -> f a b -> f c d
bimap
можно рассматривать как применение пары операций fmap
к типу данных.
Правильный экземпляр Bifunctor
для типа f
должен удовлетворять бифунторным законам , аналогичным законам функтора :
bimap id id = id -- identity
bimap (f . g) (h . i) = bimap f h . bimap g i -- composition
Класс Bifunctor
находится в модуле Data.Bifunctor
. Для версий GHC> 7.10 этот модуль поставляется вместе с компилятором; для более ранних версий вам необходимо установить пакет bifunctors
.