Haskell Language
Bifunctor
Buscar..
Sintaxis
- bimap :: (a -> b) -> (c -> d) -> pac -> pbd
- primero :: (a -> b) -> pac -> pbc
- segundo :: (b -> c) -> pab -> pac
Observaciones
Una ejecución del Functor mill es covariante en un único parámetro de tipo. Por ejemplo, si f es un Functor , luego se le asigna un fa y una función de la forma a -> b , se puede obtener un fb (mediante el uso de fmap ).
Un Bifunctor es covariante en dos parámetros de tipo. Si f es un Bifunctor , luego se le asigna un fab , y dos funciones, una de a -> c , y otra de b -> d , entonces se puede obtener un fcd (usando bimap ).
first debe pensarse como un fmap sobre el primer parámetro de tipo, second como un fmap sobre el segundo, y bimap debe concebirse como un mapeo de dos funciones de forma covariante sobre los parámetros de primer y segundo tipo, respectivamente.
Instancias comunes de Bifunctor
Tuplas de dos elementos
(,) es un ejemplo de un tipo que tiene una instancia de Bifunctor .
instance Bifunctor (,) where
bimap f g (x, y) = (f x, g y)
bimap toma un par de funciones y las aplica a los componentes respectivos de la tupla.
bimap (+ 2) (++ "nie") (3, "john") --> (5,"johnnie")
bimap ceiling length (3.5 :: Double, "john" :: String) --> (4,4)
Either
Either las Either instancias de Bifunctor selecciona una de las dos funciones para aplicar dependiendo de si el valor es Left o Right .
instance Bifunctor Either where
bimap f g (Left x) = Left (f x)
bimap f g (Right y) = Right (g y)
primero y segundo
Si se desea mapear de forma covariante solo sobre el primer argumento, o solo sobre el segundo, se debe usar first o second (en lugar 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
Por ejemplo,
ghci> second (+ 2) (Right 40)
Right 42
ghci> second (+ 2) (Left "uh oh")
Left "uh oh"
Definición de Bifunctor
Bifunctor es la clase de tipos con dos parámetros de tipo ( f :: * -> * -> * ), los cuales pueden ser mapeados de forma covariante simultáneamente.
class Bifunctor f where
bimap :: (a -> c) -> (b -> d) -> f a b -> f c d
Puede pensarse que bimap aplica un par de operaciones fmap a un tipo de datos.
Una instancia correcta de Bifunctor para un tipo f debe satisfacer las leyes de bifuncores , que son análogas a las leyes de functor :
bimap id id = id -- identity
bimap (f . g) (h . i) = bimap f h . bimap g i -- composition
La clase Bifunctor se encuentra en el módulo Data.Bifunctor . Para las versiones de GHC> 7.10, este módulo se incluye con el compilador; para versiones anteriores necesita instalar el paquete bifunctors .