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
.