Haskell Language
Bifunctor
Sök…
Syntax
- bimap :: (a -> b) -> (c -> d) -> pac -> pbd
- först :: (a -> b) -> pac -> pbc
- andra :: (b -> c) -> pab -> pac
Anmärkningar
En körning av fabriken Functor
är kovariant i en enda typ parameter. Till exempel, om f
är en Functor
, då ges en fa
, och en funktion av formen a -> b
, kan man få en fb
(genom användning av fmap
).
En Bifunctor
är kovariant i två typparametrar. Om f
är en Bifunctor
, då du får en fab
, och två funktioner, en från a -> c
, och en annan från b -> d
, kan man få en fcd
(med hjälp av bimap
).
first
bör man tänka på som en fmap
över den första typparametern, den second
som en fmap
över den andra, och bimap
bör tänkas som kartläggning av två funktioner som fmap
med fmap
den första fmap
den andra bimap
.
Vanliga instanser av Bifunctor
Två-element tuplar
(,)
är ett exempel på en typ som har en Bifunctor
instans.
instance Bifunctor (,) where
bimap f g (x, y) = (f x, g y)
bimap
tar ett par funktioner och tillämpar dem på tuplets respektive komponenter.
bimap (+ 2) (++ "nie") (3, "john") --> (5,"johnnie")
bimap ceiling length (3.5 :: Double, "john" :: String) --> (4,4)
Either
Either
instansen av Bifunctor
väljer en av de två funktionerna som ska tillämpas beroende på om värdet är Left
eller Right
.
instance Bifunctor Either where
bimap f g (Left x) = Left (f x)
bimap f g (Right y) = Right (g y)
första och andra
Om kartläggning övergripande över endast det första argumentet, eller endast det andra argumentet, önskas, bör first
eller second
användningen (i stället för 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
Till exempel,
ghci> second (+ 2) (Right 40)
Right 42
ghci> second (+ 2) (Left "uh oh")
Left "uh oh"
Definition av Bifunctor
Bifunctor
är den typ av typer med två typparametrar ( f :: * -> * -> *
), som båda kan kartläggas samtidigt.
class Bifunctor f where
bimap :: (a -> c) -> (b -> d) -> f a b -> f c d
bimap
kan tänkas som att använda ett par fmap
operationer på en datatyp.
En korrekt instans av Bifunctor
för en typ f
måste uppfylla bifunktorlagarna , som är analoga med funktorlagarna :
bimap id id = id -- identity
bimap (f . g) (h . i) = bimap f h . bimap g i -- composition
Bifunctor
finns i Data.Bifunctor
modulen. För GHC-versioner> 7.10 ingår den här modulen i kompilatorn; för tidigare versioner måste du installera bifunctors
paketet.