Haskell Language
Bifunctor
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 .