Поиск…


Синтаксис

  • 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 .



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