Haskell Language
Profunctor
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