app' :: Expr -> Expr -> Expr
app' (App HeadMap f) Bottom = Bottom
app' (App HeadMap f) (Singleton e) = app' f e
+app' (App Uncurry _) Bottom = Bottom
+app' (App Uncurry f) (Pair v1 v2) = f `app'` v1 `app'` v2
app' (App (App EitherMap f1) f2) Bottom = Bottom
app' (App (App EitherMap f1) f2) (ELeft v) = ELeft (app' f1 v)
app' (App (App EitherMap f1) f2) (ERight v) = ERight (app' f2 v)
(absTerm2Expr ex e)
absTerm2Expr ex (T.Right t) = ERight (absTerm2Expr ex t)
absTerm2Expr ex (T.Left t) = ELeft (absTerm2Expr ex t)
-absTerm2Expr ex (T.PCase pt v1 v2 e) = Uncurry `app'`
+absTerm2Expr ex (T.PCase pt v1 v2 e) = app' (app'
+ Uncurry
(lambda' (E.Var (termVar2EVar v1))
(lambda' (E.Var (termVar2EVar v2))
- (absTerm2Expr ex e)))
- `app'` (absTerm2Expr ex pt)
+ (absTerm2Expr ex e))))
+ (absTerm2Expr ex pt)
termVar2EVar (T.TermVar i) = E.FromTypVar i