letU :: (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
letU rr1 rr2 = translate $ \e -> case e of
  (C.LetRec binds e)  -> do let bndrs = map fst binds
                            liftM2 mappend (liftM mconcat (mapM (apply (C.LetBinding bndrs) rr1 . snd) binds))
                                           (apply (C.LetBody bndrs) rr2 e)
  _                   -> fail "letU"
letU :: (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
letU rr1 rr2 = translate $ \e -> case e of
  (C.LetRec binds e)  -> do let bndrs = map fst binds
                            liftM2 mappend (liftM mconcat (mapM (apply (C.LetBinding bndrs) rr1 . snd) binds))
                                           (apply (C.LetBody bndrs) rr2 e)
  _                   -> fail "letU"
letU rr1 rr2 = translate $ \e -> case e of
  (C.LetRec binds e)  -> do let bndrs = map fst binds
                            liftM2 mappend (liftM mconcat (mapM (apply (C.LetBinding bndrs) rr1 . snd) binds))
                                           (apply (C.LetBody bndrs) rr2 e)
  _                   -> fail "letU"