implement Functor.map2