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 .



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow