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


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