Haskell Language
Bifunctor
Suche…
Syntax
- bimap :: (a -> b) -> (c -> d) -> pac -> pbd
- zuerst :: (a -> b) -> pac -> pbc
- zweite :: (b -> c) -> pab -> pac
Bemerkungen
Ein Lauf der Mühle Functor
ist in einem einzigen Typparameter kovariant. Wenn beispielsweise f
ein Functor
, dann ein fa
und eine Funktion der Form a -> b
, kann man ein fb
(durch Verwendung von fmap
).
Ein Bifunctor
ist in zwei Typparametern kovariant. Wenn f
ein Bifunctor
, dann eine fab
und zwei Funktionen, eine von a -> c
und eine andere von b -> d
, dann kann man eine fcd
(mit bimap
) erhalten.
first
sollte man sich eine fmap
über den ersten Typparameter fmap
, second
eine fmap
über den zweiten, und bimap
sollte so konzipiert werden, dass zwei Funktionen kovariant über den ersten bzw. den zweiten Typparameter bimap
werden.
Häufige Instanzen von Bifunctor
Tupel mit zwei Elementen
(,)
ist ein Beispiel für einen Typ mit einer Bifunctor
Instanz.
instance Bifunctor (,) where
bimap f g (x, y) = (f x, g y)
bimap
übernimmt ein Paar von Funktionen und wendet sie auf die jeweiligen Komponenten des Tupels an.
bimap (+ 2) (++ "nie") (3, "john") --> (5,"johnnie")
bimap ceiling length (3.5 :: Double, "john" :: String) --> (4,4)
Either
Either
beiden Bifunctor
wählt Bifunctor
eine der beiden anzuwendenden Funktionen aus, je nachdem, ob der Wert Left
oder Right
.
instance Bifunctor Either where
bimap f g (Left x) = Left (f x)
bimap f g (Right y) = Right (g y)
erster und zweiter
Wenn eine kovariante Abbildung nur für das erste Argument oder nur für das zweite Argument erwünscht ist, müssen first
oder second
(anstelle von bimap
) verwendet werden.
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
Zum Beispiel,
ghci> second (+ 2) (Right 40)
Right 42
ghci> second (+ 2) (Left "uh oh")
Left "uh oh"
Definition von Bifunctor
Bifunctor
ist die Klasse von Typen mit zwei Typparametern ( f :: * -> * -> *
), die gleichzeitig kovariant abgebildet werden können.
class Bifunctor f where
bimap :: (a -> c) -> (b -> d) -> f a b -> f c d
bimap
kann sich bimap
, dass bimap
ein Paar von fmap
Operationen auf einen Datentyp anwendet.
Eine korrekte Instanz von Bifunctor
für einen Typ f
muss den Bifunctor-Gesetzen entsprechen , die den Funktorsätzen entsprechen :
bimap id id = id -- identity
bimap (f . g) (h . i) = bimap f h . bimap g i -- composition
Die Bifunctor
Klasse befindet sich im Data.Bifunctor
Modul. Bei GHC-Versionen> 7.10 ist dieses Modul im Compiler enthalten. Für frühere Versionen müssen Sie das bifunctors
Paket installieren.