on master help sign in
Get patterns to type-check with the value in the case expression
d15d84dEvan Czaplicki
compiler/Type/Constrain/Pattern.hs+2−1
@@ -42,6 +42,7 @@ constrain env pattern tipe =
42
42
43 PData name patterns -> do
43 PData name patterns -> do
44 (kind, cvars, ctipe) <- freshDataScheme env name
44 (kind, cvars, ctipe) <- freshDataScheme env name
45+ tipe' <- foldr (==>) tipe <$> mapM (\_ -> VarN <$> flexibleVar) [1..kind]
45 let tvars = map VarN cvars
46 let tvars = map VarN cvars
46 msg = concat [ "Constructor '", name, "' expects ", show kind
47 msg = concat [ "Constructor '", name, "' expects ", show kind
47 , " argument", if kind == 1 then "" else "s"
48 , " argument", if kind == 1 then "" else "s"
@@ -49,7 +50,7 @@ constrain env pattern tipe =
49 if length patterns /= kind then error msg else do
50 if length patterns /= kind then error msg else do
50 fragment <- Monad.liftM joinFragments (Monad.zipWithM (constrain env) patterns tvars)
51 fragment <- Monad.liftM joinFragments (Monad.zipWithM (constrain env) patterns tvars)
51 return $ fragment {
52 return $ fragment {
52− typeConstraint = typeConstraint fragment /\ tipe === ctipe,
53+ typeConstraint = typeConstraint fragment /\ tipe' === ctipe,
53 vars = cvars ++ vars fragment
54 vars = cvars ++ vars fragment
54 }
55 }
55
56