Ricerca…


Sintassi

  • bimap :: (a -> b) -> (c -> d) -> pac -> pbd
  • prima :: (a -> b) -> pac -> pbc
  • secondo :: (b -> c) -> pab -> pac

Osservazioni

Una corsa del mulino Functor è covariante in un singolo parametro di tipo. Ad esempio, se f è un Functor , quindi dato un fa , e una funzione della forma a -> b , si può ottenere un fb (attraverso l'uso di fmap ).

Un Bifunctor è covariante in due parametri di tipo. Se f è un Bifunctor , quindi dato un fab , e due funzioni, una da a -> c , e un'altra da b -> d , allora si può ottenere un fcd (usando la bimap ).

first dovrebbe pensare come una fmap sul primo parametro di tipo, la second come una fmap sulla seconda, e la bimap dovrebbe essere concepita come una mappatura di due funzioni covarianti rispetto ai parametri del primo e del secondo tipo, rispettivamente.

Istanze comuni di Bifunctor

Tuple a due elementi

(,) è un esempio di un tipo che ha un'istanza Bifunctor .

instance Bifunctor (,) where
    bimap f g (x, y) = (f x, g y)

bimap prende una coppia di funzioni e le applica ai rispettivi componenti della tupla.

bimap (+ 2) (++ "nie") (3, "john") --> (5,"johnnie")
bimap ceiling length (3.5 :: Double, "john" :: String) --> (4,4)

Either

Either istanza di Bifunctor di Bifunctor seleziona una delle due funzioni da applicare a seconda che il valore sia Left o Right .

instance Bifunctor Either where
    bimap f g (Left x) = Left (f x)
    bimap f g (Right y) = Right (g y)

primo e secondo

Se si desidera mappare in modo covariante solo il primo argomento, o solo il secondo argomento, si desidera utilizzare first o second (al posto di 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

Per esempio,

ghci> second (+ 2) (Right 40)
Right 42
ghci> second (+ 2) (Left "uh oh")
Left "uh oh"

Definizione di Bifunctor

Bifunctor è la classe di tipi con due parametri di tipo ( f :: * -> * -> * ), entrambi possono essere mappati in modo covariante simultaneamente.

class Bifunctor f where
    bimap :: (a -> c) -> (b -> d) -> f a b -> f c d

bimap può pensare a bimap applicando una coppia di operazioni fmap a un tipo di dati.

Un'istanza corretta di Bifunctor per un tipo f deve soddisfare le leggi del bifunctor , che sono analoghe alle leggi del funtore :

bimap id id = id  -- identity
bimap (f . g) (h . i) = bimap f h . bimap g i  -- composition

La classe Bifunctor si trova nel modulo Data.Bifunctor . Per le versioni di GHC> 7.10, questo modulo è in bundle con il compilatore; per le versioni precedenti è necessario installare il pacchetto bifunctors .



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow