Haskell Language
Bifunctor
Zoeken…
Syntaxis
- bimap :: (a -> b) -> (c -> d) -> pac -> pbd
- eerst :: (a -> b) -> pac -> pbc
- seconde :: (b -> c) -> pab -> pac
Opmerkingen
Een Functor
is covariant in een enkele typeparameter. Als f
bijvoorbeeld een Functor
, en vervolgens een fa
, en een functie van de vorm a -> b
, kan men een fb
verkrijgen (door het gebruik van fmap
).
Een Bifunctor
is covariant in twee Bifunctor
. Als f
een Bifunctor
, dan een fab
en twee functies, een van a -> c
en een andere van b -> d
, dan kan men een fcd
(met bimap
).
first
moet worden gedacht als een fmap
over de eerste parameter, ten second
als een fmap
over de tweede, en bimap
moet worden opgevat als het toewijzen van twee functies covariant over respectievelijk de eerste en tweede type parameters.
Veel voorkomende gevallen van Bifunctor
Tweedelige tupels
(,)
is een voorbeeld van een type dat een Bifunctor
instantie heeft.
instance Bifunctor (,) where
bimap f g (x, y) = (f x, g y)
bimap
neemt een paar functies en past deze toe op de respectieve componenten van de tuple.
bimap (+ 2) (++ "nie") (3, "john") --> (5,"johnnie")
bimap ceiling length (3.5 :: Double, "john" :: String) --> (4,4)
Either
Either
instanties van Bifunctor
een van de twee functies die moeten worden toegepast, afhankelijk van het feit of de waarde Left
of Right
.
instance Bifunctor Either where
bimap f g (Left x) = Left (f x)
bimap f g (Right y) = Right (g y)
eerste en tweede
Als covariant alleen het eerste argument, of alleen het tweede argument, in kaart wordt gebracht, moet het first
of second
argument worden gebruikt (in plaats van 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
Bijvoorbeeld,
ghci> second (+ 2) (Right 40)
Right 42
ghci> second (+ 2) (Left "uh oh")
Left "uh oh"
Definitie van Bifunctor
Bifunctor
is de klasse van typen met twee Bifunctor
( f :: * -> * -> *
), die beide tegelijkertijd covariant kunnen worden toegewezen.
class Bifunctor f where
bimap :: (a -> c) -> (b -> d) -> f a b -> f c d
bimap
kan worden beschouwd als het toepassen van een paar fmap
bewerkingen op een gegevenstype.
Een correcte voorbeeld van Bifunctor
van een type f
moeten aan de bifunctor wetten, die analoog zijn aan de functor wetten :
bimap id id = id -- identity
bimap (f . g) (h . i) = bimap f h . bimap g i -- composition
De klasse Bifunctor
bevindt zich in de module Data.Bifunctor
. Voor GHC-versies> 7.10 wordt deze module gebundeld met de compiler; voor eerdere versies moet u het bifunctors
pakket installeren.