-| WEVar : CoreVar -> WeakExpr
-| WELit : HaskLiteral -> WeakExpr
-| WELet : CoreVar -> WeakExpr -> WeakExpr -> WeakExpr
-| WELetRec : Tree ??(CoreVar * WeakExpr) -> WeakExpr -> WeakExpr
-| WECast : WeakExpr -> CoreCoercion -> WeakExpr
-| WENote : Note -> WeakExpr -> WeakExpr
-| WEApp : WeakExpr -> WeakExpr -> WeakExpr
-| WETyApp : WeakExpr -> CoreType -> WeakExpr
-| WECoApp : WeakExpr -> CoreCoercion -> WeakExpr
-| WELam : CoreVar -> WeakExpr -> WeakExpr
-| WETyLam : CoreVar -> WeakExpr -> WeakExpr
-| WECoLam : CoreVar -> WeakExpr -> WeakExpr
-| WEBrak : CoreVar -> WeakExpr -> WeakExpr
-| WEEsc : CoreVar -> WeakExpr -> WeakExpr
+| WEVar : WeakExprVar -> WeakExpr
+| WELit : HaskLiteral -> WeakExpr
+| WELet : WeakExprVar -> WeakExpr -> WeakExpr -> WeakExpr
+| WELetRec : Tree ??(WeakExprVar * WeakExpr) -> WeakExpr -> WeakExpr
+| WECast : WeakExpr -> WeakCoercion -> WeakExpr
+| WENote : Note -> WeakExpr -> WeakExpr
+| WEApp : WeakExpr -> WeakExpr -> WeakExpr
+| WETyApp : WeakExpr -> WeakType -> WeakExpr
+| WECoApp : WeakExpr -> WeakCoercion -> WeakExpr
+| WELam : WeakExprVar -> WeakExpr -> WeakExpr
+| WETyLam : WeakTypeVar -> WeakExpr -> WeakExpr
+| WECoLam : WeakCoerVar -> WeakExpr -> WeakExpr
+
+(* the WeakType argument in WEBrak/WEEsc is used only when going back *)
+(* from Weak to Core; it lets us dodge a possibly-failing type *)
+(* calculation *)
+| WEBrak : WeakTypeVar -> WeakExpr -> WeakType -> WeakExpr
+| WEEsc : WeakTypeVar -> WeakExpr -> WeakType -> WeakExpr
+
+(* note that HaskWeak "Case" does not bind a variable; coreExprToWeakExpr adds a let-binder *)