@@ -42,7 +42,7 @@ import Control.Monad.State
42import Control.Monad.Error
42import Control.Monad.Error
44import Control.Applicative
44import Control.Applicative
45−import Control.Arrow (Kleisli(..), (***), (&&&))
45+import Control.Arrow (Kleisli(..), (***), (&&&), first)
46import qualified Control.Category as C
46import qualified Control.Category as C
48import qualified Data.Map as M
48import qualified Data.Map as M
@@ -105,7 +105,7 @@ allUnknownsBecameQuantified cs solution ty = do
105 guardWith "Unsolved row variable" $ null $ unsolvedRows \\ rowsMentioned
105 guardWith "Unsolved row variable" $ null $ unsolvedRows \\ rowsMentioned
107setify :: Row -> Row
107setify :: Row -> Row
108−setify = rowFromList . (M.toList . M.fromList *** id) . rowToList
108+setify = rowFromList . first (M.toList . M.fromList) . rowToList
110setifyAll :: (D.Data d) => d -> d
110setifyAll :: (D.Data d) => d -> d
111setifyAll = everywhere (mkT setify)
111setifyAll = everywhere (mkT setify)
@@ -143,7 +143,7 @@ varIfUnknown ty =
144 case M.lookup n m of
144 case M.lookup n m of
145 Nothing -> do
145 Nothing -> do
146− let name = "t" ++ show (M.size m)
146+ let name = 't' : show (M.size m)
147 put $ M.insert n name m
147 put $ M.insert n name m
148 return $ TypeVar name
148 return $ TypeVar name
149 Just name -> return $ TypeVar name
149 Just name -> return $ TypeVar name
@@ -153,7 +153,7 @@ varIfUnknown ty =
154 case M.lookup n m of
154 case M.lookup n m of
155 Nothing -> do
155 Nothing -> do
156− let name = "r" ++ show (M.size m)
156+ let name = 'r' : show (M.size m)
157 put $ M.insert n name m
157 put $ M.insert n name m
158 return $ RowVar name
158 return $ RowVar name
159 Just name -> return $ RowVar name
159 Just name -> return $ RowVar name
@@ -198,9 +198,9 @@ replaceAllTypeSynonyms d = do
198 either throwError return $ saturateAllTypeSynonyms syns d
198 either throwError return $ saturateAllTypeSynonyms syns d
200desaturateAllTypeSynonyms :: (D.Data d) => d -> d
200desaturateAllTypeSynonyms :: (D.Data d) => d -> d
201−desaturateAllTypeSynonyms = everywhere (mkT $ replace)
201+desaturateAllTypeSynonyms = everywhere (mkT replace)
203− replace (SaturatedTypeSynonym name args) = foldl (\t arg -> TypeApp t arg) (TypeConstructor name) args
203+ replace (SaturatedTypeSynonym name args) = foldl TypeApp (TypeConstructor name) args
204 replace t = t
204 replace t = t
206replaceType :: (D.Data d) => Int -> Type -> d -> d
206replaceType :: (D.Data d) => Int -> Type -> d -> d
@@ -259,7 +259,7 @@ typeConstraints _ v@(BooleanLiteral _) = do
259 return ([TypeConstraint me Boolean (ValueOrigin v)], me)
259 return ([TypeConstraint me Boolean (ValueOrigin v)], me)
260typeConstraints m v@(ArrayLiteral vals) = do
260typeConstraints m v@(ArrayLiteral vals) = do
261 all <- mapM (typeConstraints m) vals
261 all <- mapM (typeConstraints m) vals
262− let (cs, ns) = (concat . map fst &&& map snd) all
262+ let (cs, ns) = (concatMap fst &&& map snd) all
263 me <- fresh
263 me <- fresh
264 return (cs ++ zipWith (\n el -> TypeConstraint me (Array $ TUnknown n) (ValueOrigin el)) ns vals, me)
264 return (cs ++ zipWith (\n el -> TypeConstraint me (Array $ TUnknown n) (ValueOrigin el)) ns vals, me)
265typeConstraints m u@(Unary op val) = do
265typeConstraints m u@(Unary op val) = do
@@ -274,15 +274,15 @@ typeConstraints m b@(Binary op left right) = do
274typeConstraints m v@(ObjectLiteral ps) = do
274typeConstraints m v@(ObjectLiteral ps) = do
275 ensureNoDuplicateProperties ps
275 ensureNoDuplicateProperties ps
276 all <- mapM (typeConstraints m . snd) ps
276 all <- mapM (typeConstraints m . snd) ps
277− let (cs, ns) = (concat . map fst &&& map snd) all
277+ let (cs, ns) = (concatMap fst &&& map snd) all
278 me <- fresh
278 me <- fresh
279 let tys = zipWith (\(name, _) u -> (name, TUnknown u)) ps ns
279 let tys = zipWith (\(name, _) u -> (name, TUnknown u)) ps ns
280− return ((TypeConstraint me (Object (typesToRow tys)) (ValueOrigin v)) : cs, me)
280+ return (TypeConstraint me (Object (typesToRow tys)) (ValueOrigin v) : cs, me)
281typeConstraints m v@(ObjectUpdate o ps) = do
281typeConstraints m v@(ObjectUpdate o ps) = do
282 ensureNoDuplicateProperties ps
282 ensureNoDuplicateProperties ps
283 (cs1, n1) <- typeConstraints m o
283 (cs1, n1) <- typeConstraints m o
284 all <- mapM (typeConstraints m . snd) ps
284 all <- mapM (typeConstraints m . snd) ps
285− let (cs2, ns) = (concat . map fst &&& map snd) all
285+ let (cs2, ns) = (concatMap fst &&& map snd) all
286 row <- fresh
286 row <- fresh
287 let tys = zipWith (\(name, _) u -> (name, TUnknown u)) ps ns
287 let tys = zipWith (\(name, _) u -> (name, TUnknown u)) ps ns
288 return (TypeConstraint n1 (Object (rowFromList (tys, RUnknown row))) (ValueOrigin v) : cs1 ++ cs2, n1)
288 return (TypeConstraint n1 (Object (rowFromList (tys, RUnknown row))) (ValueOrigin v) : cs1 ++ cs2, n1)
@@ -290,24 +290,24 @@ typeConstraints m v@(Indexer index val) = do
290 (cs1, n1) <- typeConstraints m index
290 (cs1, n1) <- typeConstraints m index
291 (cs2, n2) <- typeConstraints m val
291 (cs2, n2) <- typeConstraints m val
292 me <- fresh
292 me <- fresh
293− return ((TypeConstraint n1 Number (ValueOrigin index)) : (TypeConstraint n2 (Array (TUnknown me)) (ValueOrigin v)) : cs1 ++ cs2, me)
293+ return (TypeConstraint n1 Number (ValueOrigin index) : TypeConstraint n2 (Array (TUnknown me)) (ValueOrigin v) : cs1 ++ cs2, me)
294typeConstraints m v@(Accessor prop val) = do
294typeConstraints m v@(Accessor prop val) = do
295 (cs, n1) <- typeConstraints m val
295 (cs, n1) <- typeConstraints m val
296 me <- fresh
296 me <- fresh
297 rest <- fresh
297 rest <- fresh
298− return ((TypeConstraint n1 (Object (RCons prop (TUnknown me) (RUnknown rest))) (ValueOrigin v)) : cs, me)
298+ return (TypeConstraint n1 (Object (RCons prop (TUnknown me) (RUnknown rest))) (ValueOrigin v) : cs, me)
299typeConstraints m v@(Abs args ret) = do
299typeConstraints m v@(Abs args ret) = do
300 ns <- replicateM (length args) fresh
300 ns <- replicateM (length args) fresh
301− let m' = m `M.union` M.fromList (zipWith (,) args ns)
301+ let m' = m `M.union` M.fromList (zip args ns)
302 (cs, n') <- typeConstraints m' ret
302 (cs, n') <- typeConstraints m' ret
303 me <- fresh
303 me <- fresh
304− return ((TypeConstraint me (Function (map TUnknown ns) (TUnknown n')) (ValueOrigin v)) : cs, me)
304+ return (TypeConstraint me (Function (map TUnknown ns) (TUnknown n')) (ValueOrigin v) : cs, me)
305typeConstraints m v@(App f xs) = do
305typeConstraints m v@(App f xs) = do
306 (cs1, n1) <- typeConstraints m f
306 (cs1, n1) <- typeConstraints m f
307 all <- mapM (typeConstraints m) xs
307 all <- mapM (typeConstraints m) xs
308− let (cs2, ns) = (concat . map fst &&& map snd) all
308+ let (cs2, ns) = (concatMap fst &&& map snd) all
309 me <- fresh
309 me <- fresh
310− return ((TypeConstraint n1 (Function (map TUnknown ns) (TUnknown me)) (ValueOrigin v)) : cs1 ++ cs2, me)
310+ return (TypeConstraint n1 (Function (map TUnknown ns) (TUnknown me)) (ValueOrigin v) : cs1 ++ cs2, me)
311typeConstraints m v@(Var var) =
311typeConstraints m v@(Var var) =
312 case M.lookup var m of
312 case M.lookup var m of
313 Nothing -> do
313 Nothing -> do
@@ -381,7 +381,7 @@ equalityBinOpConstraints :: Value -> Int -> Int -> Int -> [TypeConstraint]
381equalityBinOpConstraints v left right result = [TypeConstraint left (TUnknown right) (ValueOrigin v), TypeConstraint result Boolean (ValueOrigin v)]
381equalityBinOpConstraints v left right result = [TypeConstraint left (TUnknown right) (ValueOrigin v), TypeConstraint result Boolean (ValueOrigin v)]
383symBinOpConstraints :: Value -> Type -> Int -> Int -> Int -> [TypeConstraint]
383symBinOpConstraints :: Value -> Type -> Int -> Int -> Int -> [TypeConstraint]
384−symBinOpConstraints v ty left right result = asymBinOpConstraints v ty ty left right result
384+symBinOpConstraints v ty = asymBinOpConstraints v ty ty
386asymBinOpConstraints :: Value -> Type -> Type -> Int -> Int -> Int -> [TypeConstraint]
386asymBinOpConstraints :: Value -> Type -> Type -> Int -> Int -> Int -> [TypeConstraint]
387asymBinOpConstraints v ty res left right result = [TypeConstraint left ty (ValueOrigin v), TypeConstraint right ty (ValueOrigin v), TypeConstraint result res (ValueOrigin v)]
387asymBinOpConstraints v ty res left right result = [TypeConstraint left ty (ValueOrigin v), TypeConstraint right ty (ValueOrigin v), TypeConstraint result res (ValueOrigin v)]
@@ -408,14 +408,14 @@ typeConstraintsForBinder val b@(UnaryBinder ctor binder) = do
408 obj <- fresh
408 obj <- fresh
409 (Function [ty] ret) <- replaceVarsWithUnknowns idents f
409 (Function [ty] ret) <- replaceVarsWithUnknowns idents f
410 (cs, m1) <- typeConstraintsForBinder obj binder
410 (cs, m1) <- typeConstraintsForBinder obj binder
411− return ((TypeConstraint val ret (BinderOrigin b)) : (TypeConstraint obj ty (BinderOrigin b)) : cs, m1)
411+ return (TypeConstraint val ret (BinderOrigin b) : TypeConstraint obj ty (BinderOrigin b) : cs, m1)
412 Just _ -> throwError $ ctor ++ " is not a unary constructor"
412 Just _ -> throwError $ ctor ++ " is not a unary constructor"
413 _ -> throwError $ "Constructor " ++ ctor ++ " is not defined"
413 _ -> throwError $ "Constructor " ++ ctor ++ " is not defined"
414typeConstraintsForBinder val b@(ObjectBinder props) = do
414typeConstraintsForBinder val b@(ObjectBinder props) = do
415 row <- fresh
415 row <- fresh
416 rest <- fresh
416 rest <- fresh
417 (cs, m1) <- typeConstraintsForProperties row (RUnknown rest) props
417 (cs, m1) <- typeConstraintsForProperties row (RUnknown rest) props
418− return ((TypeConstraint val (Object (RUnknown row)) (BinderOrigin b)) : cs, m1)
418+ return (TypeConstraint val (Object (RUnknown row)) (BinderOrigin b) : cs, m1)
420 typeConstraintsForProperties :: Int -> Row -> [(String, Binder)] -> Check ([TypeConstraint], M.Map Ident Int)
420 typeConstraintsForProperties :: Int -> Row -> [(String, Binder)] -> Check ([TypeConstraint], M.Map Ident Int)
421 typeConstraintsForProperties nrow row [] = return ([RowConstraint nrow row (BinderOrigin b)], M.empty)
421 typeConstraintsForProperties nrow row [] = return ([RowConstraint nrow row (BinderOrigin b)], M.empty)
@@ -423,17 +423,17 @@ typeConstraintsForBinder val b@(ObjectBinder props) = do
423 propTy <- fresh
423 propTy <- fresh
424 (cs1, m1) <- typeConstraintsForBinder propTy binder
424 (cs1, m1) <- typeConstraintsForBinder propTy binder
425 (cs2, m2) <- typeConstraintsForProperties nrow (RCons name (TUnknown propTy) row) binders
425 (cs2, m2) <- typeConstraintsForProperties nrow (RCons name (TUnknown propTy) row) binders
426− return (cs1 ++ cs2, M.union m1 m2)
426+ return (cs1 ++ cs2, m1 `M.union` m2)
427typeConstraintsForBinder val b@(ArrayBinder binders rest) = do
427typeConstraintsForBinder val b@(ArrayBinder binders rest) = do
428 el <- fresh
428 el <- fresh
429 all <- mapM (typeConstraintsForBinder el) binders
429 all <- mapM (typeConstraintsForBinder el) binders
430− let (cs1, m1) = (concat . map fst &&& M.unions . map snd) all
430+ let (cs1, m1) = (concatMap fst &&& M.unions . map snd) all
431 let arrayConstraint = TypeConstraint val (Array (TUnknown el)) (BinderOrigin b)
431 let arrayConstraint = TypeConstraint val (Array (TUnknown el)) (BinderOrigin b)
432 case rest of
432 case rest of
433 Nothing -> return (arrayConstraint : cs1, m1)
433 Nothing -> return (arrayConstraint : cs1, m1)
434 Just binder -> do
434 Just binder -> do
435 (cs2, m2) <- typeConstraintsForBinder val binder
435 (cs2, m2) <- typeConstraintsForBinder val binder
436− return (arrayConstraint : cs1 ++ cs2, M.union m1 m2)
436+ return (arrayConstraint : cs1 ++ cs2, m1 `M.union` m2)
437typeConstraintsForBinder val b@(NamedBinder name binder) = do
437typeConstraintsForBinder val b@(NamedBinder name binder) = do
438 me <- fresh
438 me <- fresh
439 (cs, m) <- typeConstraintsForBinder val binder
439 (cs, m) <- typeConstraintsForBinder val binder
@@ -450,9 +450,9 @@ typeConstraintsForBinders :: M.Map Ident Int -> Int -> Int -> [(Binder, Value)]
450typeConstraintsForBinders _ _ _ [] = return []
450typeConstraintsForBinders _ _ _ [] = return []
451typeConstraintsForBinders m nval ret ((binder, val):bs) = do
451typeConstraintsForBinders m nval ret ((binder, val):bs) = do
452 (cs1, m1) <- typeConstraintsForBinder nval binder
452 (cs1, m1) <- typeConstraintsForBinder nval binder
453− (cs2, n2) <- typeConstraints (M.union m m1) val
453+ (cs2, n2) <- typeConstraints (m `M.union` m1) val
454 cs3 <- typeConstraintsForBinders m nval ret bs
454 cs3 <- typeConstraintsForBinders m nval ret bs
455− return ((TypeConstraint n2 (TUnknown ret) (BinderOrigin binder)) : cs1 ++ cs2 ++ cs3)
455+ return (TypeConstraint n2 (TUnknown ret) (BinderOrigin binder) : cs1 ++ cs2 ++ cs3)
457assignVariable :: Ident -> M.Map Ident Int -> Check ()
457assignVariable :: Ident -> M.Map Ident Int -> Check ()
458assignVariable name m =
458assignVariable name m =
@@ -464,27 +464,27 @@ typeConstraintsForStatement :: M.Map Ident Int -> M.Map Ident Int -> Int -> Stat
464typeConstraintsForStatement m mass ret (VariableIntroduction name val) = do
464typeConstraintsForStatement m mass ret (VariableIntroduction name val) = do
465 assignVariable name (m `M.union` mass)
465 assignVariable name (m `M.union` mass)
466 (cs1, n1) <- typeConstraints m val
466 (cs1, n1) <- typeConstraints m val
467− return $ (cs1, False, M.insert name n1 mass)
467+ return (cs1, False, M.insert name n1 mass)
468typeConstraintsForStatement m mass ret (Assignment ident val) = do
468typeConstraintsForStatement m mass ret (Assignment ident val) = do
469 (cs1, n1) <- typeConstraints m val
469 (cs1, n1) <- typeConstraints m val
470 case M.lookup ident mass of
470 case M.lookup ident mass of
471 Nothing -> throwError $ "No local variable with name " ++ show ident
471 Nothing -> throwError $ "No local variable with name " ++ show ident
472− Just ty -> do
472+ Just ty ->
473 return (TypeConstraint n1 (TUnknown ty) (AssignmentTargetOrigin ident) : cs1, False, mass)
473 return (TypeConstraint n1 (TUnknown ty) (AssignmentTargetOrigin ident) : cs1, False, mass)
474typeConstraintsForStatement m mass ret (While val inner) = do
474typeConstraintsForStatement m mass ret (While val inner) = do
475 (cs1, n1) <- typeConstraints m val
475 (cs1, n1) <- typeConstraints m val
476 (cs2, allCodePathsReturn, _) <- typeConstraintsForBlock m mass ret inner
476 (cs2, allCodePathsReturn, _) <- typeConstraintsForBlock m mass ret inner
477− return $ ((TypeConstraint n1 Boolean (ValueOrigin val)) : cs1 ++ cs2, allCodePathsReturn, mass)
477+ return (TypeConstraint n1 Boolean (ValueOrigin val) : cs1 ++ cs2, allCodePathsReturn, mass)
478typeConstraintsForStatement m mass ret (If ifst) = do
478typeConstraintsForStatement m mass ret (If ifst) = do
479 (cs, allCodePathsReturn) <- typeConstraintsForIfStatement m mass ret ifst
479 (cs, allCodePathsReturn) <- typeConstraintsForIfStatement m mass ret ifst
480− return $ (cs, allCodePathsReturn, mass)
480+ return (cs, allCodePathsReturn, mass)
481typeConstraintsForStatement m mass ret (For ident start end inner) = do
481typeConstraintsForStatement m mass ret (For ident start end inner) = do
482 assignVariable ident (m `M.union` mass)
482 assignVariable ident (m `M.union` mass)
483 (cs1, n1) <- typeConstraints (m `M.union` mass) start
483 (cs1, n1) <- typeConstraints (m `M.union` mass) start
484 (cs2, n2) <- typeConstraints (m `M.union` mass) end
484 (cs2, n2) <- typeConstraints (m `M.union` mass) end
485 let mass1 = M.insert ident n1 mass
485 let mass1 = M.insert ident n1 mass
486 (cs3, allCodePathsReturn, _) <- typeConstraintsForBlock (m `M.union` mass1) mass1 ret inner
486 (cs3, allCodePathsReturn, _) <- typeConstraintsForBlock (m `M.union` mass1) mass1 ret inner
487− return $ ((TypeConstraint n1 Number (ValueOrigin start)) : (TypeConstraint n2 Number (ValueOrigin end)) : cs1 ++ cs2 ++ cs3, allCodePathsReturn, mass)
487+ return (TypeConstraint n1 Number (ValueOrigin start) : TypeConstraint n2 Number (ValueOrigin end) : cs1 ++ cs2 ++ cs3, allCodePathsReturn, mass)
488typeConstraintsForStatement m mass ret (ForEach ident vals inner) = do
488typeConstraintsForStatement m mass ret (ForEach ident vals inner) = do
489 assignVariable ident (m `M.union` mass)
489 assignVariable ident (m `M.union` mass)
490 val <- fresh
490 val <- fresh
@@ -492,21 +492,21 @@ typeConstraintsForStatement m mass ret (ForEach ident vals inner) = do
492 let mass1 = M.insert ident val mass
492 let mass1 = M.insert ident val mass
493 (cs2, allCodePathsReturn, _) <- typeConstraintsForBlock (m `M.union` mass1) mass1 ret inner
493 (cs2, allCodePathsReturn, _) <- typeConstraintsForBlock (m `M.union` mass1) mass1 ret inner
494 guardWith "Cannot return from within a foreach block" $ not allCodePathsReturn
494 guardWith "Cannot return from within a foreach block" $ not allCodePathsReturn
495− return $ ((TypeConstraint n1 (Array (TUnknown val)) (ValueOrigin vals)) : cs1 ++ cs2, False, mass)
495+ return (TypeConstraint n1 (Array (TUnknown val)) (ValueOrigin vals) : cs1 ++ cs2, False, mass)
496typeConstraintsForStatement m mass ret (Return val) = do
496typeConstraintsForStatement m mass ret (Return val) = do
497 (cs1, n1) <- typeConstraints (m `M.union` mass) val
497 (cs1, n1) <- typeConstraints (m `M.union` mass) val
498− return ((TypeConstraint n1 (TUnknown ret) (ValueOrigin val)) : cs1, True, mass)
498+ return (TypeConstraint n1 (TUnknown ret) (ValueOrigin val) : cs1, True, mass)
500typeConstraintsForIfStatement :: M.Map Ident Int -> M.Map Ident Int -> Int -> IfStatement -> Check ([TypeConstraint], Bool)
500typeConstraintsForIfStatement :: M.Map Ident Int -> M.Map Ident Int -> Int -> IfStatement -> Check ([TypeConstraint], Bool)
501typeConstraintsForIfStatement m mass ret (IfStatement val thens Nothing) = do
501typeConstraintsForIfStatement m mass ret (IfStatement val thens Nothing) = do
502 (cs1, n1) <- typeConstraints m val
502 (cs1, n1) <- typeConstraints m val
503 (cs2, _, _) <- typeConstraintsForBlock m mass ret thens
503 (cs2, _, _) <- typeConstraintsForBlock m mass ret thens
504− return ((TypeConstraint n1 Boolean (ValueOrigin val)) : cs1 ++ cs2, False)
504+ return (TypeConstraint n1 Boolean (ValueOrigin val) : cs1 ++ cs2, False)
505typeConstraintsForIfStatement m mass ret (IfStatement val thens (Just elses)) = do
505typeConstraintsForIfStatement m mass ret (IfStatement val thens (Just elses)) = do
506 (cs1, n1) <- typeConstraints m val
506 (cs1, n1) <- typeConstraints m val
507 (cs2, allCodePathsReturn1, _) <- typeConstraintsForBlock m mass ret thens
507 (cs2, allCodePathsReturn1, _) <- typeConstraintsForBlock m mass ret thens
508 (cs3, allCodePathsReturn2) <- typeConstraintsForElseStatement m mass ret elses
508 (cs3, allCodePathsReturn2) <- typeConstraintsForElseStatement m mass ret elses
509− return ((TypeConstraint n1 Boolean (ValueOrigin val)) : cs1 ++ cs2 ++ cs3, allCodePathsReturn1 && allCodePathsReturn2)
509+ return (TypeConstraint n1 Boolean (ValueOrigin val) : cs1 ++ cs2 ++ cs3, allCodePathsReturn1 && allCodePathsReturn2)
511typeConstraintsForElseStatement :: M.Map Ident Int -> M.Map Ident Int -> Int -> ElseStatement -> Check ([TypeConstraint], Bool)
511typeConstraintsForElseStatement :: M.Map Ident Int -> M.Map Ident Int -> Int -> ElseStatement -> Check ([TypeConstraint], Bool)
512typeConstraintsForElseStatement m mass ret (Else elses) = do
512typeConstraintsForElseStatement m mass ret (Else elses) = do
@@ -541,7 +541,7 @@ solveTypeConstraints (RowConstraint n r o:cs) s = do
541 (cs', s') <- rethrow (\err -> "Error in " ++ prettyPrintOrigin o ++ ": " ++ err) $ do
541 (cs', s') <- rethrow (\err -> "Error in " ++ prettyPrintOrigin o ++ ": " ++ err) $ do
542 rowOccursCheck n r
542 rowOccursCheck n r
543 let s' = let (f, g) = runTypeSolution s
543 let s' = let (f, g) = runTypeSolution s
544− in TypeSolution $ (replaceRow n r . f, replaceRow n r . g)
544+ in TypeSolution (replaceRow n r . f, replaceRow n r . g)
545 cs' <- fmap concat $ mapM (substituteRowInConstraint n r) cs
545 cs' <- fmap concat $ mapM (substituteRowInConstraint n r) cs
546 return (cs', s')
546 return (cs', s')
547 solveTypeConstraints cs' s'
547 solveTypeConstraints cs' s'
@@ -603,8 +603,8 @@ unifyRows o r1 r2 =
603 (s1, r1') = rowToList r1
603 (s1, r1') = rowToList r1
604 (s2, r2') = rowToList r2
604 (s2, r2') = rowToList r2
605 int = [ (t1, t2) | (name, t1) <- s1, (name', t2) <- s2, name == name' ]
605 int = [ (t1, t2) | (name, t1) <- s1, (name', t2) <- s2, name == name' ]
606− sd1 = [ (name, t1) | (name, t1) <- s1, not (elem name (map fst s2)) ]
606+ sd1 = [ (name, t1) | (name, t1) <- s1, name `notElem` map fst s2 ]
607− sd2 = [ (name, t2) | (name, t2) <- s2, not (elem name (map fst s1)) ]
607+ sd2 = [ (name, t2) | (name, t2) <- s2, name `notElem` map fst s1 ]
609 cs1 <- fmap concat $ mapM (uncurry $ unifyTypes o) int
609 cs1 <- fmap concat $ mapM (uncurry $ unifyTypes o) int
610 cs2 <- unifyRows' o sd1 r1' sd2 r2'
610 cs2 <- unifyRows' o sd1 r1' sd2 r2'