Haskell Language
Profunctor
Sök…
Introduktion
Profunctor
är ett typklass som tillhandahålls av profunctors
paketet i Data.Profunctor
.
Se avsnittet "Anmärkningar" för en fullständig förklaring.
Syntax
- dimap :: Profunctor p => (a -> b) -> (c -> d) -> pbc -> dyna
- 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
Anmärkningar
Profunctors är, som beskrivs av dokumenten på Hackage, "en bifunktor där det första argumentet är motstridande och det andra argumentet är kovariant."
Så vad betyder detta? Tja, en bifunktor är som en vanlig funktor, förutom att den har två parametrar istället för en, var och en med sin egen fmap
liknande funktion att kartlägga på den.
Att vara "kovariant" betyder att det andra argumentet till en profunctor är precis som en vanlig funktor: dess mappningsfunktion ( rmap
) har en Profunctor p => (b -> c) -> pab -> pac
för Profunctor p => (b -> c) -> pab -> pac
. Det kartlägger bara funktionen på det andra argumentet.
Att vara "contravariant" gör det första argumentet lite skrånande. Istället för att kartlägga som en vanlig funktor har dess mappningsfunktion ( lmap
) en Profunctor p => (a -> b) -> pbc -> pac
för Profunctor p => (a -> b) -> pbc -> pac
. Denna till synes bakåtkända kartläggning är mest meningsfull för ingångar till en funktion: du skulle köra a -> b
på ingången och sedan din andra funktion och lämna den nya ingången som a
.
Obs: Namnet på de normala funktorerna med ett argument är lite vilseledande: Functor
typklass implementerar "covariant" funktorer, medan "contravariant" funktorer implementeras i Contravariant
typklass i Data.Functor.Contravariant
, och tidigare (missvisande namngivna) Cofunctor
typclass i Data.Cofunctor
.
(->) Profunctor
(->) är ett enkelt exempel på en profunctor: det vänstra argumentet är ingången till en funktion, och det högra argumentet är detsamma som läsarens funktorinstans.
instance Profunctor (->) where
lmap f g = g . f
rmap f g = g . g