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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow