Haskell Language
Profunctor
Recherche…
Introduction
Profunctor
est une classe de types fournis par le profunctors
paquet dans Data.Profunctor
.
Voir la section "Remarques" pour une explication complète.
Syntaxe
- dimap :: Profunctor p => (a -> b) -> (c -> d) -> pbc -> pad
- lmap :: Profunctor p => (a -> b) -> pbc -> pac
- rmap :: Profunctor p => (b -> c) -> pab -> pac
- id de dimap id = id
- lmap id = id
- rmap id = id
- dimap fg = lmap f. rmap g
- lmap f = dimap f id
- rmap f = id dimap f
Remarques
Les descripteurs sont, comme décrit par les documents sur Hackage, "un bifunctor où le premier argument est contravariant et le second argument est covariant".
Qu'est-ce que cela signifie? Eh bien, un bifunctor est comme un foncteur normal, sauf qu'il a deux paramètres au lieu d'un, chacun avec sa propre fonction de type fmap
pour le mapper.
Etre "covariant" signifie que le second argument de la source est comme un foncteur normal: sa fonction de mappage ( rmap
) a un type signature de Profunctor p => (b -> c) -> pab -> pac
. Il ne fait que mapper la fonction sur le second argument.
Être "contravariant" rend le premier argument un peu plus étrange. Au lieu de mapper comme un foncteur normal, sa fonction de mappage ( lmap
) a une signature de type Profunctor p => (a -> b) -> pbc -> pac
. Cette correspondance apparemment en arrière est très utile pour les entrées d'une fonction: vous exécuteriez a -> b
sur l'entrée, puis votre autre fonction, en laissant la nouvelle entrée sous la forme d' a
.
Note: La dénomination des foncteurs normaux à un argument est un peu trompeuse: la Functor
Functor implémente des foncteurs "covariants", tandis que les foncteurs "contravariant" sont implémentés dans la classe Contravariant
dans Data.Functor.Contravariant
, et précédemment la (dénomination trompeuse) Cofunctor
cofunctor dans Data.Cofunctor
.
(->) Profunctor
(->) est un exemple simple de source: l'argument de gauche est l'entrée d'une fonction et l'argument de droite est le même que l'instance de foncteur de lecteur.
instance Profunctor (->) where
lmap f g = g . f
rmap f g = g . g