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
.