Ricerca…


introduzione

Profunctor è un typeclass fornito dal profunctors pacchetto Data.Profunctor .

Vedere la sezione "Osservazioni" per una spiegazione completa.

Sintassi

  • 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

Osservazioni

I profunctors sono, come descritto dai documenti su Hackage, "un bifunctor in cui il primo argomento è controverso e il secondo argomento è covariante".

Che cosa significa questo? Bene, un bifunctore è come un normale funtore, tranne per il fatto che ha due parametri invece di uno, ciascuno con la sua funzione simile a fmap .

Essere "covariante" significa che il secondo argomento di un profunctor è proprio come un normale functor: la sua funzione di mappatura ( rmap ) ha una firma di tipo di Profunctor p => (b -> c) -> pab -> pac . Mappa semplicemente la funzione sul secondo argomento.

Essere "controverso" rende il primo argomento un po 'più strano. Invece di mappare come un normale funtore, la sua funzione di mappatura ( lmap ) ha una firma di tipo di Profunctor p => (a -> b) -> pbc -> pac . Questa mappatura apparentemente arretrata ha più senso per gli input di una funzione: si dovrebbe eseguire a -> b sull'input e quindi l'altra funzione, lasciando il nuovo input come a .

Nota: la denominazione per i normali funtori di un argomento è un po 'fuorviante: la Functor Functor implementa i funtori "covarianti", mentre i funtori "controvarianti" sono implementati nella Contravariant Contravariante in Data.Functor.Contravariant , e in precedenza (in modo fuorviante) Cofunctor Cofunctor in Data.Cofunctor .

(->) Profunctor

(->) è un semplice esempio di un profunctor: l'argomento di sinistra è l'input di una funzione e l'argomento di destra è lo stesso dell'istanza di functor del lettore.

instance Profunctor (->) where
    lmap f g = g . f
    rmap f g = g . g


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow