@@ -42,7 +42,7 @@ import Control.Monad.State
4242import Control.Monad.Error
4343
4444import Control.Applicative
45−import Control.Arrow (Kleisli(..), (***), (&&&))
45+import Control.Arrow (Kleisli(..), (***), (&&&), first)
4646import qualified Control.Category as C
4747
4848import qualified Data.Map as M
@@ -105,7 +105,7 @@ allUnknownsBecameQuantified cs solution ty = do
105105 guardWith "Unsolved row variable" $ null $ unsolvedRows \\ rowsMentioned
106106
107107setify :: Row -> Row
108−setify = rowFromList . (M.toList . M.fromList *** id) . rowToList
108+setify = rowFromList . first (M.toList . M.fromList) . rowToList
109109
110110setifyAll :: (D.Data d) => d -> d
111111setifyAll = everywhere (mkT setify)
@@ -143,7 +143,7 @@ varIfUnknown ty =
143143 m <- get
144144 case M.lookup n m of
145145 Nothing -> do
146− let name = "t" ++ show (M.size m)
146+ let name = 't' : show (M.size m)
147147 put $ M.insert n name m
148148 return $ TypeVar name
149149 Just name -> return $ TypeVar name
@@ -153,7 +153,7 @@ varIfUnknown ty =
153153 m <- get
154154 case M.lookup n m of
155155 Nothing -> do
156− let name = "r" ++ show (M.size m)
156+ let name = 'r' : show (M.size m)
157157 put $ M.insert n name m
158158 return $ RowVar name
159159 Just name -> return $ RowVar name
@@ -198,9 +198,9 @@ replaceAllTypeSynonyms d = do
198198 either throwError return $ saturateAllTypeSynonyms syns d
199199
200200desaturateAllTypeSynonyms :: (D.Data d) => d -> d
201−desaturateAllTypeSynonyms = everywhere (mkT $ replace)
201+desaturateAllTypeSynonyms = everywhere (mkT replace)
202202 where
203− replace (SaturatedTypeSynonym name args) = foldl (\t arg -> TypeApp t arg) (TypeConstructor name) args
203+ replace (SaturatedTypeSynonym name args) = foldl TypeApp (TypeConstructor name) args
204204 replace t = t
205205
206206replaceType :: (D.Data d) => Int -> Type -> d -> d
@@ -259,7 +259,7 @@ typeConstraints _ v@(BooleanLiteral _) = do
259259 return ([TypeConstraint me Boolean (ValueOrigin v)], me)
260260typeConstraints m v@(ArrayLiteral vals) = do
261261 all <- mapM (typeConstraints m) vals
262− let (cs, ns) = (concat . map fst &&& map snd) all
262+ let (cs, ns) = (concatMap fst &&& map snd) all
263263 me <- fresh
264264 return (cs ++ zipWith (\n el -> TypeConstraint me (Array $ TUnknown n) (ValueOrigin el)) ns vals, me)
265265typeConstraints m u@(Unary op val) = do
@@ -274,15 +274,15 @@ typeConstraints m b@(Binary op left right) = do
274274typeConstraints m v@(ObjectLiteral ps) = do
275275 ensureNoDuplicateProperties ps
276276 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
278278 me <- fresh
279279 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)
281281typeConstraints m v@(ObjectUpdate o ps) = do
282282 ensureNoDuplicateProperties ps
283283 (cs1, n1) <- typeConstraints m o
284284 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
286286 row <- fresh
287287 let tys = zipWith (\(name, _) u -> (name, TUnknown u)) ps ns
288288 return (TypeConstraint n1 (Object (rowFromList (tys, RUnknown row))) (ValueOrigin v) : cs1 ++ cs2, n1)
@@ -290,24 +290,24 @@ typeConstraints m v@(Indexer index val) = do
290290 (cs1, n1) <- typeConstraints m index
291291 (cs2, n2) <- typeConstraints m val
292292 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)
294294typeConstraints m v@(Accessor prop val) = do
295295 (cs, n1) <- typeConstraints m val
296296 me <- fresh
297297 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)
299299typeConstraints m v@(Abs args ret) = do
300300 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)
302302 (cs, n') <- typeConstraints m' ret
303303 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)
305305typeConstraints m v@(App f xs) = do
306306 (cs1, n1) <- typeConstraints m f
307307 all <- mapM (typeConstraints m) xs
308− let (cs2, ns) = (concat . map fst &&& map snd) all
308+ let (cs2, ns) = (concatMap fst &&& map snd) all
309309 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)
311311typeConstraints m v@(Var var) =
312312 case M.lookup var m of
313313 Nothing -> do
@@ -381,7 +381,7 @@ equalityBinOpConstraints :: Value -> Int -> Int -> Int -> [TypeConstraint]
381381equalityBinOpConstraints v left right result = [TypeConstraint left (TUnknown right) (ValueOrigin v), TypeConstraint result Boolean (ValueOrigin v)]
382382
383383symBinOpConstraints :: 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
385385
386386asymBinOpConstraints :: Value -> Type -> Type -> Int -> Int -> Int -> [TypeConstraint]
387387asymBinOpConstraints 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
408408 obj <- fresh
409409 (Function [ty] ret) <- replaceVarsWithUnknowns idents f
410410 (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)
412412 Just _ -> throwError $ ctor ++ " is not a unary constructor"
413413 _ -> throwError $ "Constructor " ++ ctor ++ " is not defined"
414414typeConstraintsForBinder val b@(ObjectBinder props) = do
415415 row <- fresh
416416 rest <- fresh
417417 (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)
419419 where
420420 typeConstraintsForProperties :: Int -> Row -> [(String, Binder)] -> Check ([TypeConstraint], M.Map Ident Int)
421421 typeConstraintsForProperties nrow row [] = return ([RowConstraint nrow row (BinderOrigin b)], M.empty)
@@ -423,17 +423,17 @@ typeConstraintsForBinder val b@(ObjectBinder props) = do
423423 propTy <- fresh
424424 (cs1, m1) <- typeConstraintsForBinder propTy binder
425425 (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)
427427typeConstraintsForBinder val b@(ArrayBinder binders rest) = do
428428 el <- fresh
429429 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
431431 let arrayConstraint = TypeConstraint val (Array (TUnknown el)) (BinderOrigin b)
432432 case rest of
433433 Nothing -> return (arrayConstraint : cs1, m1)
434434 Just binder -> do
435435 (cs2, m2) <- typeConstraintsForBinder val binder
436− return (arrayConstraint : cs1 ++ cs2, M.union m1 m2)
436+ return (arrayConstraint : cs1 ++ cs2, m1 `M.union` m2)
437437typeConstraintsForBinder val b@(NamedBinder name binder) = do
438438 me <- fresh
439439 (cs, m) <- typeConstraintsForBinder val binder
@@ -450,9 +450,9 @@ typeConstraintsForBinders :: M.Map Ident Int -> Int -> Int -> [(Binder, Value)]
450450typeConstraintsForBinders _ _ _ [] = return []
451451typeConstraintsForBinders m nval ret ((binder, val):bs) = do
452452 (cs1, m1) <- typeConstraintsForBinder nval binder
453− (cs2, n2) <- typeConstraints (M.union m m1) val
453+ (cs2, n2) <- typeConstraints (m `M.union` m1) val
454454 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)
456456
457457assignVariable :: Ident -> M.Map Ident Int -> Check ()
458458assignVariable name m =
@@ -464,27 +464,27 @@ typeConstraintsForStatement :: M.Map Ident Int -> M.Map Ident Int -> Int -> Stat
464464typeConstraintsForStatement m mass ret (VariableIntroduction name val) = do
465465 assignVariable name (m `M.union` mass)
466466 (cs1, n1) <- typeConstraints m val
467− return $ (cs1, False, M.insert name n1 mass)
467+ return (cs1, False, M.insert name n1 mass)
468468typeConstraintsForStatement m mass ret (Assignment ident val) = do
469469 (cs1, n1) <- typeConstraints m val
470470 case M.lookup ident mass of
471471 Nothing -> throwError $ "No local variable with name " ++ show ident
472− Just ty -> do
472+ Just ty ->
473473 return (TypeConstraint n1 (TUnknown ty) (AssignmentTargetOrigin ident) : cs1, False, mass)
474474typeConstraintsForStatement m mass ret (While val inner) = do
475475 (cs1, n1) <- typeConstraints m val
476476 (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)
478478typeConstraintsForStatement m mass ret (If ifst) = do
479479 (cs, allCodePathsReturn) <- typeConstraintsForIfStatement m mass ret ifst
480− return $ (cs, allCodePathsReturn, mass)
480+ return (cs, allCodePathsReturn, mass)
481481typeConstraintsForStatement m mass ret (For ident start end inner) = do
482482 assignVariable ident (m `M.union` mass)
483483 (cs1, n1) <- typeConstraints (m `M.union` mass) start
484484 (cs2, n2) <- typeConstraints (m `M.union` mass) end
485485 let mass1 = M.insert ident n1 mass
486486 (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)
488488typeConstraintsForStatement m mass ret (ForEach ident vals inner) = do
489489 assignVariable ident (m `M.union` mass)
490490 val <- fresh
@@ -492,21 +492,21 @@ typeConstraintsForStatement m mass ret (ForEach ident vals inner) = do
492492 let mass1 = M.insert ident val mass
493493 (cs2, allCodePathsReturn, _) <- typeConstraintsForBlock (m `M.union` mass1) mass1 ret inner
494494 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)
496496typeConstraintsForStatement m mass ret (Return val) = do
497497 (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)
499499
500500typeConstraintsForIfStatement :: M.Map Ident Int -> M.Map Ident Int -> Int -> IfStatement -> Check ([TypeConstraint], Bool)
501501typeConstraintsForIfStatement m mass ret (IfStatement val thens Nothing) = do
502502 (cs1, n1) <- typeConstraints m val
503503 (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)
505505typeConstraintsForIfStatement m mass ret (IfStatement val thens (Just elses)) = do
506506 (cs1, n1) <- typeConstraints m val
507507 (cs2, allCodePathsReturn1, _) <- typeConstraintsForBlock m mass ret thens
508508 (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)
510510
511511typeConstraintsForElseStatement :: M.Map Ident Int -> M.Map Ident Int -> Int -> ElseStatement -> Check ([TypeConstraint], Bool)
512512typeConstraintsForElseStatement m mass ret (Else elses) = do
@@ -541,7 +541,7 @@ solveTypeConstraints (RowConstraint n r o:cs) s = do
541541 (cs', s') <- rethrow (\err -> "Error in " ++ prettyPrintOrigin o ++ ": " ++ err) $ do
542542 rowOccursCheck n r
543543 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)
545545 cs' <- fmap concat $ mapM (substituteRowInConstraint n r) cs
546546 return (cs', s')
547547 solveTypeConstraints cs' s'
@@ -603,8 +603,8 @@ unifyRows o r1 r2 =
603603 (s1, r1') = rowToList r1
604604 (s2, r2') = rowToList r2
605605 int = [ (t1, t2) | (name, t1) <- s1, (name', t2) <- s2, name == name' ]
606− sd1 = [ (name, t1) | (name, t1) <- s1, not (elem name (map fst s2)) ]
607− sd2 = [ (name, t2) | (name, t2) <- s2, not (elem name (map fst s1)) ]
606+ sd1 = [ (name, t1) | (name, t1) <- s1, name `notElem` map fst s2 ]
607+ sd2 = [ (name, t2) | (name, t2) <- s2, name `notElem` map fst s1 ]
608608 in do
609609 cs1 <- fmap concat $ mapM (uncurry $ unifyTypes o) int
610610 cs2 <- unifyRows' o sd1 r1' sd2 r2'