@@ -30,6 +30,8 @@ import PureScript.Names
30import PureScript.TypeChecker.Monad
30import PureScript.TypeChecker.Monad
31import PureScript.TypeChecker.Kinds
31import PureScript.TypeChecker.Kinds
32import PureScript.TypeChecker.Synonyms
32import PureScript.TypeChecker.Synonyms
33+import PureScript.CodeGen.Pretty.Types
34+import PureScript.CodeGen.Pretty.Kinds
34import Control.Monad.State
36import Control.Monad.State
35import Control.Monad.Error
37import Control.Monad.Error
@@ -51,7 +53,7 @@ emptyTypeSolution = TypeSolution (TUnknown, RUnknown)
52typeOf :: Ident -> Value -> Check PolyType
54typeOf :: Ident -> Value -> Check PolyType
53typeOf name val = do
55typeOf name val = do
54− (cs, n) <- case val of
56+ (cs, n) <- case val of
55 Abs _ _ -> do
57 Abs _ _ -> do
56 me <- fresh
58 me <- fresh
57 (cs, n) <- typeConstraints (M.singleton name me) val
59 (cs, n) <- typeConstraints (M.singleton name me) val
@@ -77,7 +79,7 @@ allUnknownsBecameQuantified cs solution ty = do
77 TypeConstraint _ t -> findUnknownRows t
79 TypeConstraint _ t -> findUnknownRows t
78 RowConstraint u r -> u : findUnknownRows r
80 RowConstraint u r -> u : findUnknownRows r
79 unsolvedRows = filter (\n -> RUnknown n == snd (runTypeSolution solution) n) unknownRows
81 unsolvedRows = filter (\n -> RUnknown n == snd (runTypeSolution solution) n) unknownRows
80− guardWith ("Unsolved row variable" ++ show (unsolvedRows \\ rowsMentioned) ++ ", " ++ show cs) $ null $ unsolvedRows \\ rowsMentioned
82+ guardWith "Unsolved row variable" $ null $ unsolvedRows \\ rowsMentioned
82findUnknownTypes :: (Data d) => d -> [Int]
84findUnknownTypes :: (Data d) => d -> [Int]
83findUnknownTypes = everything (++) (mkQ [] f)
85findUnknownTypes = everything (++) (mkQ [] f)
@@ -166,11 +168,11 @@ replaceRow n r = everywhere (mkT go)
167typeOccursCheck :: Int -> Type -> Check ()
169typeOccursCheck :: Int -> Type -> Check ()
168typeOccursCheck u (TUnknown _) = return ()
170typeOccursCheck u (TUnknown _) = return ()
169−typeOccursCheck u t = when (occursCheck u t) $ throwError $ "Occurs check failed: " ++ show u ++ " = " ++ show t
171+typeOccursCheck u t = when (occursCheck u t) $ throwError $ "Occurs check failed: " ++ show u ++ " = " ++ prettyPrintType t
171rowOccursCheck :: Int -> Row -> Check ()
173rowOccursCheck :: Int -> Row -> Check ()
172rowOccursCheck u (RUnknown _) = return ()
174rowOccursCheck u (RUnknown _) = return ()
173−rowOccursCheck u r = when (occursCheck u r) $ throwError $ "Occurs check failed: " ++ show u ++ " = " ++ show r
175+rowOccursCheck u r = when (occursCheck u r) $ throwError $ "Occurs check failed: " ++ show u ++ " = " ++ prettyPrintRow r
175occursCheck :: (Data d) => Int -> d -> Bool
177occursCheck :: (Data d) => Int -> d -> Bool
176occursCheck u = everything (||) $ flip extQ g $ mkQ False f
178occursCheck u = everything (||) $ flip extQ g $ mkQ False f
@@ -273,7 +275,7 @@ typeConstraints m (IfThenElse cond th el) = do
273 return (TypeConstraint n1 Boolean : TypeConstraint n2 (TUnknown n3) : cs1 ++ cs2 ++ cs3, n2)
275 return (TypeConstraint n1 Boolean : TypeConstraint n2 (TUnknown n3) : cs1 ++ cs2 ++ cs3, n2)
274typeConstraints m (TypedValue val poly@(PolyType idents ty)) = do
276typeConstraints m (TypedValue val poly@(PolyType idents ty)) = do
275 kind <- kindOf poly
277 kind <- kindOf poly
276− guardWith ("Expected type of kind *, was " ++ show kind) $ kind == Star
278+ guardWith ("Expected type of kind *, was " ++ prettyPrintKind kind) $ kind == Star
277 desugared <- replaceAllTypeSynonyms ty
279 desugared <- replaceAllTypeSynonyms ty
278 (cs, n1) <- typeConstraints m val
280 (cs, n1) <- typeConstraints m val
279 return (TypeConstraint n1 desugared : cs, n1)
281 return (TypeConstraint n1 desugared : cs, n1)
@@ -534,7 +536,7 @@ unifyTypes (TypeApp t1 t2) (TypeApp t3 t4) = do
534 cs1 <- unifyTypes t1 t3
536 cs1 <- unifyTypes t1 t3
535 cs2 <- unifyTypes t2 t4
537 cs2 <- unifyTypes t2 t4
536 return $ cs1 ++ cs2
538 return $ cs1 ++ cs2
537−unifyTypes t1 t2 = throwError $ "Cannot unify " ++ show t1 ++ " with " ++ show t2 ++ "."
539+unifyTypes t1 t2 = throwError $ "Cannot unify " ++ prettyPrintType t1 ++ " with " ++ prettyPrintType t2 ++ "."
539unifyRows :: Row -> Row -> Check [TypeConstraint]
541unifyRows :: Row -> Row -> Check [TypeConstraint]
540unifyRows r1 r2 =
542unifyRows r1 r2 =
@@ -544,7 +546,7 @@ unifyRows r1 r2 =
544 int = [ (t1, t2) | (name, t1) <- s1, (name', t2) <- s2, name == name' ]
546 int = [ (t1, t2) | (name, t1) <- s1, (name', t2) <- s2, name == name' ]
545 sd1 = [ (name, t1) | (name, t1) <- s1, not (elem name (map fst s2)) ]
547 sd1 = [ (name, t1) | (name, t1) <- s1, not (elem name (map fst s2)) ]
546 sd2 = [ (name, t2) | (name, t2) <- s2, not (elem name (map fst s1)) ]
548 sd2 = [ (name, t2) | (name, t2) <- s2, not (elem name (map fst s1)) ]
547− in rethrow (\e -> "Cannot unify " ++ show r1 ++ " with " ++ show r2 ++ ": " ++ e) $ do
549+ in rethrow (\e -> "Cannot unify " ++ prettyPrintRow r1 ++ " with " ++ prettyPrintRow r2 ++ ": " ++ e) $ do
548 cs1 <- fmap concat $ mapM (uncurry unifyTypes) int
550 cs1 <- fmap concat $ mapM (uncurry unifyTypes) int
549 cs2 <- unifyRows' sd1 r1' sd2 r2'
551 cs2 <- unifyRows' sd1 r1' sd2 r2'
550 return $ cs1 ++ cs2
552 return $ cs1 ++ cs2
@@ -561,7 +563,7 @@ unifyRows r1 r2 =
561 cs <- unifyRows' row r others (RUnknown u')
563 cs <- unifyRows' row r others (RUnknown u')
562 return (RowConstraint u (RCons name ty (RUnknown u')) : cs)
564 return (RowConstraint u (RCons name ty (RUnknown u')) : cs)
563 unifyRows' [] REmpty [] REmpty = return []
565 unifyRows' [] REmpty [] REmpty = return []
564− unifyRows' sd1 r1 sd2 r2 = throwError $ "Cannot unify " ++ show (fromList (sd1, r1)) ++ " with " ++ show (fromList (sd2, r2)) ++ "."
566+ unifyRows' sd1 r1 sd2 r2 = throwError $ "Cannot unify " ++ prettyPrintRow (fromList (sd1, r1)) ++ " with " ++ prettyPrintRow (fromList (sd2, r2)) ++ "."
565 toList :: Row -> ([(String, Type)], Row)
567 toList :: Row -> ([(String, Type)], Row)
566 toList (RCons name ty row) = let (tys, rest) = toList row
568 toList (RCons name ty row) = let (tys, rest) = toList row
567 in ((name, ty):tys, rest)
569 in ((name, ty):tys, rest)