appU :: (Monad m, Monoid r)
  => Translate m [C.CoreContext] C.Term r
  -> Translate m [C.CoreContext] C.Term r
  -> Translate m [C.CoreContext] C.Term r
appU rr1 rr2 = translate $ \e -> case e of
  (C.App e1 e2) -> liftM2 mappend (apply C.AppFirst rr1 e1) (apply C.AppSecond rr2 e2)
  _             -> fail "appU"
appU :: (Monad m, Monoid r)
  => Translate m [C.CoreContext] C.Term r
  -> Translate m [C.CoreContext] C.Term r
  -> Translate m [C.CoreContext] C.Term r
appU rr1 rr2 = translate $ \e -> case e of
  (C.App e1 e2) -> liftM2 mappend (apply C.AppFirst rr1 e1) (apply C.AppSecond rr2 e2)
  _             -> fail "appU"
appU rr1 rr2 = translate $ \e -> case e of
  (C.App e1 e2) -> liftM2 mappend (apply C.AppFirst rr1 e1) (apply C.AppSecond rr2 e2)
  _             -> fail "appU"