Bifunctor
磨机 Functor 的运行在单一类型参数中是协变的。例如,如果 f 是 Functor,那么给定 f a,以及形式 a -> b 的函数,可以获得 f b(通过使用 fmap)。
Bifunctor 在两个类型参数中是协变的。如果 f 是 Bifunctor,那么给出一个 f a b 和两个函数,一个来自 a -> c,另一个来自 b -> d,那么就可以获得一个 f c d(使用 bimap)。
first 应该被认为是第一类参数的 fmap,second 作为第二类的 fmap,bimap 应该被设想为分别在第一和第二类型参数上共同映射两个函数。