Bifunctor is the class of types with two type parameters (f :: * -> * -> *), both of which can be covariantly mapped over simultaneously.
class Bifunctor f where
bimap :: (a -> c) -> (b -> d) -> f a b -> f c d
bimap can be thought of as applying a pair of fmap operations to a datatype.
A correct instance of Bifunctor for a type f must satisfy the bifunctor laws, which are analogous to the functor laws:
bimap id id = id -- identity
bimap (f . g) (h . i) = bimap f h . bimap g i -- composition
The Bifunctor class is found in the Data.Bifunctor module. For GHC versions >7.10, this module is bundled with the compiler; for earlier versions you need to install the bifunctors package.