Haskell Language
Profunner
Suche…
Einführung
Profunctor
ist eine Typenklasse, die vom profunctors
Paket in Data.Profunctor
.
Eine vollständige Erklärung finden Sie im Abschnitt "Anmerkungen".
Syntax
- 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
Bemerkungen
Profunctors sind, wie in den Dokumenten von Hackage beschrieben, "ein Bifunctor, bei dem das erste Argument kontravariant ist und das zweite Argument kovariant ist".
Was bedeutet das? Nun, ein Bifunctor ist wie ein normaler Functor, nur dass er zwei statt einen Parameter hat, jeder mit seiner eigenen fmap
ähnlichen Funktion, die darauf fmap
kann.
"Kovariant" zu sein, bedeutet, dass das zweite Argument für einen Profunctor genau wie ein normaler Funktor ist: Seine Mapping-Funktion ( rmap
) hat eine Profunctor p => (b -> c) -> pab -> pac
von Profunctor p => (b -> c) -> pab -> pac
. Es bildet nur die Funktion auf das zweite Argument ab.
"Contravariant" zu sein, macht das erste Argument etwas merkwürdiger. Anstelle eines Mappings wie bei einem normalen Funktor hat seine Mapping-Funktion ( lmap
) eine Profunctor p => (a -> b) -> pbc -> pac
von Profunctor p => (a -> b) -> pbc -> pac
. Diese anscheinend rückwärtige Zuordnung ist für die Eingaben in eine Funktion am sinnvollsten: Sie führen a -> b
an der Eingabe und dann Ihre andere Funktion aus, wobei die neue Eingabe als a
bleibt.
Anmerkung: Die Benennung für die normalen, einen Argumentfunktoren ist etwas irreführend: Die Functor
implementiert "kovariante" -Funktoren, während "contravariant" Data.Functor.Contravariant
in der Contravariant
Data.Functor.Contravariant
in Data.Functor.Contravariant
und zuvor (irreführend genannt) implementiert werden. Cofunctor
in Data.Cofunctor
.
(->) Profunctor
(->) ist ein einfaches Beispiel für einen Profunctor: Das linke Argument ist die Eingabe einer Funktion, und das rechte Argument ist das gleiche wie die Instanz des Readers.
instance Profunctor (->) where
lmap f g = g . f
rmap f g = g . g