appR :: (Monad m)
  => Rewrite m [C.CoreContext] C.Term
  -> Rewrite m [C.CoreContext] C.Term
  -> Rewrite m [C.CoreContext] C.Term
appR rr1 rr2 = transparently $ rewrite $ \e -> case e of
  (C.App e1 e2) -> liftM2 C.App (apply C.AppFirst rr1 e1) (apply C.AppSecond rr2 e2)
  _             -> fail "appR"
appR :: (Monad m)
  => Rewrite m [C.CoreContext] C.Term
  -> Rewrite m [C.CoreContext] C.Term
  -> Rewrite m [C.CoreContext] C.Term
appR rr1 rr2 = transparently $ rewrite $ \e -> case e of
  (C.App e1 e2) -> liftM2 C.App (apply C.AppFirst rr1 e1) (apply C.AppSecond rr2 e2)
  _             -> fail "appR"
appR rr1 rr2 = transparently $ rewrite $ \e -> case e of
  (C.App e1 e2) -> liftM2 C.App (apply C.AppFirst rr1 e1) (apply C.AppSecond rr2 e2)
  _             -> fail "appR"