Haskell Language
Dwufunkcyjny
Szukaj…
Składnia
- bimap :: (a -> b) -> (c -> d) -> pac -> pbd
- first :: (a -> b) -> pac -> pbc
- second :: (b -> c) -> pab -> pac
Uwagi
Uruchomienie młyna Functor
jest kowariantne w parametrze jednego typu. Na przykład, jeśli f
jest Functor
, to biorąc pod uwagę fa
i funkcję w postaci a -> b
, można uzyskać fb
(poprzez użycie fmap
).
Bifunctor
jest kowariantem w dwóch parametrach typu. Jeśli f
jest Bifunctor
, to ma fab
i dwie funkcje, jedną z a -> c
, a drugą z b -> d
, wówczas można uzyskać fcd
(używając bimap
).
first
należy traktować jako fmap
nad parametrem pierwszego typu, second
jako fmap
nad drugim parametrem, a bimap
powinien być pomyślany jako odwzorowanie dwóch funkcji bimap
odpowiednio na parametry pierwszego i drugiego typu.
Typowe przypadki Bifunctor
Krotki dwuelementowe
(,)
jest przykładem typu, który ma instancję Bifunctor
.
instance Bifunctor (,) where
bimap f g (x, y) = (f x, g y)
bimap
bierze parę funkcji i stosuje je do odpowiednich składników krotki.
bimap (+ 2) (++ "nie") (3, "john") --> (5,"johnnie")
bimap ceiling length (3.5 :: Double, "john" :: String) --> (4,4)
Either
Either
z instancji Bifunctor
wybiera jedną z dwóch funkcji, które mają być zastosowane, w zależności od tego, czy wartość jest Left
czy Right
.
instance Bifunctor Either where
bimap f g (Left x) = Left (f x)
bimap f g (Right y) = Right (g y)
pierwszy i drugi
Jeśli pożądane jest mapowanie tylko pierwszego argumentu lub tylko drugiego argumentu, należy użyć first
lub second
(zamiast 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
Na przykład,
ghci> second (+ 2) (Right 40)
Right 42
ghci> second (+ 2) (Left "uh oh")
Left "uh oh"
Definicja bifunkta
Bifunctor
to klasa typów z dwoma parametrami typu ( f :: * -> * -> *
), z których oba można jednocześnie zamapować kowariantnie.
class Bifunctor f where
bimap :: (a -> c) -> (b -> d) -> f a b -> f c d
bimap
może być traktowany jako zastosowanie pary operacji fmap
do typu danych.
Prawidłowa instancja Bifunctor
dla typu f
musi spełniać prawa bifunctor , które są analogiczne do praw funktora :
bimap id id = id -- identity
bimap (f . g) (h . i) = bimap f h . bimap g i -- composition
Klasa Bifunctor
znajduje się w module Data.Bifunctor
. Dla wersji GHC> 7.10 ten moduł jest dołączony do kompilatora; we wcześniejszych wersjach musisz zainstalować pakiet bifunctors
.