Haskell Language
Bifunctor
Recherche…
Syntaxe
- bimap :: (a -> b) -> (c -> d) -> pac -> pbd
- d'abord :: (a -> b) -> pac -> pbc
- second :: (b -> c) -> pab -> pac
Remarques
Un fonctionnement du broyeur Functor
est covariant dans un paramètre de type unique . Par exemple, si f
est un Functor
, alors on attribue une fa
et une fonction de la forme a -> b
, on peut obtenir un fb
(en utilisant fmap
).
Un Bifunctor
est covariant dans deux paramètres de type. Si f
est un Bifunctor
, on donne alors une fab
, et deux fonctions, une de a -> c
et une autre de b -> d
, on peut alors obtenir un fcd
(en utilisant bimap
).
fmap
first
devrait penser à un fmap
sur le premier paramètre de type, second
à un fmap
sur le second et bimap
devrait être conçu comme mappant deux fonctions de façon covariante respectivement sur les paramètres de premier et de second type.
Instances courantes de Bifunctor
Tuples à deux éléments
(,)
est un exemple de type qui a une instance Bifunctor
.
instance Bifunctor (,) where
bimap f g (x, y) = (f x, g y)
bimap
prend une paire de fonctions et les applique aux composants respectifs du tuple.
bimap (+ 2) (++ "nie") (3, "john") --> (5,"johnnie")
bimap ceiling length (3.5 :: Double, "john" :: String) --> (4,4)
Either
Either
'une des instances de Bifunctor
sélectionne une des deux fonctions à appliquer selon que la valeur est Left
ou Right
.
instance Bifunctor Either where
bimap f g (Left x) = Left (f x)
bimap f g (Right y) = Right (g y)
premier et deuxième
Si le mappage covariant sur le premier argument seulement, ou seulement sur le second argument, est souhaité, alors le first
ou le second
devrait être utilisé (au lieu de bimap
).
first :: Bifunctor f => (a -> c) -> f a b -> f c b
first f = bimap f id
second :: Bifunctor f => (b -> d) -> f a b -> f a d
second g = bimap id g
Par exemple,
ghci> second (+ 2) (Right 40)
Right 42
ghci> second (+ 2) (Left "uh oh")
Left "uh oh"
Définition de Bifunctor
Bifunctor
est la classe de types avec deux paramètres de type ( f :: * -> * -> *
), les deux pouvant être mappés de manière covariante simultanément.
class Bifunctor f where
bimap :: (a -> c) -> (b -> d) -> f a b -> f c d
bimap
peut être considéré comme appliquant une paire d'opérations fmap
à un type de données.
Une instance correcte de Bifunctor
pour un type f
doit satisfaire aux lois de bifonctor , qui sont analogues aux lois de foncteur :
bimap id id = id -- identity
bimap (f . g) (h . i) = bimap f h . bimap g i -- composition
La classe Bifunctor
se trouve dans le module Data.Bifunctor
. Pour les versions GHC> 7.10, ce module est fourni avec le compilateur; pour les versions antérieures, vous devez installer le package bifunctors
.