- let mk_sum [] = ([Var unitDataConId], unitTy)
- mk_sum [(expr, ty)] = ([expr], ty)
- mk_sum es = (zipWith mk_alt (tyConDataCons sum_tc) exprs,
- mkTyConApp sum_tc tys)
- where
- (exprs, tys) = unzip es
- sum_tc = sum_tcs (length es)
- mk_alt dc expr = mkConApp dc (map Type tys ++ [expr])
-
- mk_prod [] = (Var unitDataConId, unitTy)
- mk_prod [expr] = (expr, exprType expr)
- mk_prod exprs = (mkConApp prod_dc (map Type tys ++ exprs),
- mkTyConApp prod_tc tys)
- where
- tys = map exprType exprs
- prod_tc = prod_tcs (length exprs)
- [prod_dc] = tyConDataCons prod_tc
+ mk_sum [] = [Var unitDataConId]
+ mk_sum [expr] = [expr]
+ mk_sum exprs = zipWith (mk_alt prod_tys) (tyConDataCons sum_tycon) exprs
+
+ mk_alt tys dc expr = mk_con_app dc tys [expr]
+
+ mk_prod _ _ [] = Var unitDataConId
+ mk_prod _ _ [expr] = expr
+ mk_prod (Just tc) tys exprs = mk_con_app dc tys exprs
+ where
+ [dc] = tyConDataCons tc