@@ -331,10 +331,10 @@ infer' (Constructor c) = do
331331 case M.lookup (qualify modulePath c) (dataConstructors env) of
332332 Nothing -> throwError $ "Constructor " ++ show c ++ " is undefined"
333333 Just ty -> replaceAllTypeSynonyms ty
334−infer' (Case val binders) = do
335− t1 <- infer val
334+infer' (Case vals binders) = do
335+ ts <- mapM infer vals
336336 ret <- fresh
337− checkBinders t1 ret binders
337+ checkBinders ts ret binders
338338 return ret
339339infer' (IfThenElse cond th el) = do
340340 check cond Boolean
@@ -483,21 +483,17 @@ inferBinder val (ConsBinder headBinder tailBinder) = do
483483inferBinder val (NamedBinder name binder) = do
484484 m <- inferBinder val binder
485485 return $ M.insert name val m
486−inferBinder _ _ = error "Invalid argument to inferBinder"
487486
488−inferGuardedBinder :: Type -> Binder -> Subst (M.Map Ident Type)
489−inferGuardedBinder val (GuardedBinder cond binder) = do
490− m1 <- inferBinder val binder
491− bindLocalVariables (M.toList m1) $ check cond Boolean
492− return m1
493−inferGuardedBinder val b = inferBinder val b
494−
495−checkBinders :: Type -> Type -> [(Binder, Value)] -> Subst ()
487+checkBinders :: [Type] -> Type -> [([Binder], Maybe Guard, Value)] -> Subst ()
496488checkBinders _ _ [] = return ()
497−checkBinders nval ret ((binder, val):bs) = do
498− m1 <- inferGuardedBinder nval binder
499− bindLocalVariables (M.toList m1) $ check val ret
500− checkBinders nval ret bs
489+checkBinders nvals ret ((binders, grd, val):bs) = do
490+ m1 <- M.unions <$> zipWithM inferBinder nvals binders
491+ bindLocalVariables (M.toList m1) $ do
492+ check val ret
493+ case grd of
494+ Nothing -> return ()
495+ Just g -> check g Boolean
496+ checkBinders nvals ret bs
501497
502498assignVariable :: Ident -> Subst ()
503499assignVariable name = do
@@ -618,9 +614,9 @@ check' (TypedValue val ty1) ty2 = do
618614 guardWith ("Expected type of kind *, was " ++ prettyPrintKind kind) $ kind == Star
619615 ty1 `subsumes` ty2
620616 check val ty1
621−check' (Case val binders) ret = do
622− t1 <- infer val
623− checkBinders t1 ret binders
617+check' (Case vals binders) ret = do
618+ ts <- mapM infer vals
619+ checkBinders ts ret binders
624620check' (IfThenElse cond th el) ty = do
625621 check cond Boolean
626622 check th ty
@@ -712,6 +708,7 @@ inferFunctionApplication (ForAll ident ty) args = do
712708 replaced <- replaceVarWithUnknown ident ty
713709 inferFunctionApplication replaced args
714710inferFunctionApplication u@(TUnknown _) args = do
711+
715712 ret <- fresh
716713 args' <- mapM replaceAllVarsWithUnknowns args
717714 u ~~ Function args' ret