+
+ is_scalar _ (App (Var v) (Lit _))
+ | Just con <- isDataConId_maybe v = con `elem` [intDataCon, floatDataCon, doubleDataCon]
+
+ is_scalar vs (App e1 e2) = is_scalar vs e1 && is_scalar vs e2
+ is_scalar vs (Let (NonRec b letExpr) body)
+ = is_scalar vs letExpr && is_scalar (extendVarSet vs b) body
+ is_scalar vs (Let (Rec bnds) body)
+ = let vs' = extendVarSetList vs (map fst bnds)
+ in all (is_scalar vs') (map snd bnds) && is_scalar vs' body
+ is_scalar vs (Case e eId ty alts)
+ = let vs' = extendVarSet vs eId
+ in is_scalar_ty ty &&
+ is_scalar vs' e &&
+ (all (is_scalar_alt vs') alts)
+