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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow