use Data.Bifunctor instead of Control.Arrow