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 .



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow