Haskell Language
Profunctor
Zoeken…
Invoering
Profunctor
is een typeclass aangeboden door het profunctors
pakket in Data.Profunctor
.
Zie de sectie "Opmerkingen" voor een volledige uitleg.
Syntaxis
- dimap :: Profunctor p => (a -> b) -> (c -> d) -> pbc -> pad
- lmap :: Profunctor p => (a -> b) -> pbc -> pac
- rmap :: Profunctor p => (b -> c) -> pab -> pac
- dimap id id = id
- lmap id = id
- rmap id = id
- dimap fg = lmap f. rmap g
- lmap f = dimap f id
- rmap f = dimap id f
Opmerkingen
Profunctors zijn, zoals beschreven in de documenten over Hackage, "een bifunctor waar het eerste argument tegenstrijdig is en het tweede argument covariant is".
Dus wat betekent dit? Welnu, een bifunctor is als een normale functor, behalve dat het twee parameters heeft in plaats van één, elk met zijn eigen fmap
achtige functie om erop in kaart te brengen.
"Covariant" zijn betekent dat het tweede argument voor een profunctor net als een normale functor is: de mappingfunctie ( rmap
) heeft een typeaanduiding van Profunctor p => (b -> c) -> pab -> pac
. Het geeft alleen de functie van het tweede argument weer.
"Contravariant" zijn maakt het eerste argument een beetje vreemder. In plaats van het toewijzen als een normale functor, heeft de toewijzingsfunctie ( lmap
) een typeaanduiding van Profunctor p => (a -> b) -> pbc -> pac
. Deze ogenschijnlijk achterwaartse toewijzing is het meest logisch voor invoer voor een functie: u voert a -> b
op de invoer en vervolgens op uw andere functie en laat de nieuwe invoer als a
.
Opmerking: de naamgeving voor de normale, één argument functors is een beetje misleidend: de Functor
typeclass implementeert "covariante" functors, terwijl "contravariante" functors worden geïmplementeerd in de Contravariant
typeclass in Data.Functor.Contravariant
, en eerder de (misleidend genoemde) Cofunctor
typeclass in Data.Cofunctor
.
(->) Profunctor
(->) is een eenvoudig voorbeeld van een profunctor: het linkerargument is de invoer voor een functie en het rechterargument is hetzelfde als de instantie van de lezerfunctor.
instance Profunctor (->) where
lmap f g = g . f
rmap f g = g . g