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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow