[evaluate type fully even when -dboxy-steps is on. do occurs check when dealing with associated types, after expanding an associated type, try to evaluate it again.
John Meacham <john@repetae.net>**20061027040807] hunk ./FrontEnd/Tc/Class.hs 81
+       hnf TAssoc {} = True
hunk ./FrontEnd/Tc/Monad.hs 236
+    t1 <- evalFullType t1
+    t2 <- evalFullType t2
hunk ./FrontEnd/Tc/Monad.hs 396
-    ft (TForAll vs (ps :=> t)) = do
-        ps' <- sequence (map (tickleM ft') ps) -- [ ft' t >>= return . IsIn c | ~(IsIn c t) <- ps ]
-        t' <- ft' t
-        return $ TForAll vs (ps' :=> t')
-    ft (TExists vs (ps :=> t)) = do
-        ps' <- sequence (map (tickleM ft') ps) -- [ ft' t >>= return . IsIn c | ~(IsIn c t) <- ps ]
-        --ps' <- sequence [ ft' t >>= return . IsIn c | ~(IsIn c t) <- ps ]
-        t' <- ft' t
-        return $ TExists vs (ps' :=> t')
+--    ft (TForAll vs (ps :=> t)) = do
+--        ps' <- sequence (map (tickleM ft') ps) -- [ ft' t >>= return . IsIn c | ~(IsIn c t) <- ps ]
+--        t' <- ft' t
+--        return $ TForAll vs (ps' :=> t')
+--    ft (TExists vs (ps :=> t)) = do
+--        ps' <- sequence (map (tickleM ft') ps) -- [ ft' t >>= return . IsIn c | ~(IsIn c t) <- ps ]
+--        --ps' <- sequence [ ft' t >>= return . IsIn c | ~(IsIn c t) <- ps ]
+--        t' <- ft' t
+--        return $ TExists vs (ps' :=> t')
hunk ./FrontEnd/Tc/Monad.hs 425
-                Just (aa,bb,tt) -> return (applyTyvarMap (fromList $ zip aa as ++ zip bb eas) tt)
+                Just (aa,bb,tt) -> evalType (applyTyvarMap (fromList $ zip aa as ++ zip bb eas) tt)
hunk ./FrontEnd/Tc/Unify.hs 14
+import FrontEnd.Class
+import FrontEnd.SrcLoc
hunk ./FrontEnd/Tc/Unify.hs 19
-import FrontEnd.Class
-import FrontEnd.SrcLoc
-import GenUtil
hunk ./FrontEnd/Tc/Unify.hs 21
+import Support.FreeVars
+import Util.Gen
hunk ./FrontEnd/Tc/Unify.hs 39
-        (s1,_,_) <- unbox s1
-        (s2,_,_) <- unbox s2
+        s1 <- evalFullType s1
+        s2 <- evalFullType s2
hunk ./FrontEnd/Tc/Unify.hs 94
-        printRule "ASSOC"
+        printRule "ASSOC-L"
+        s1 `boxyMatch` s2
+        return ctId
+    -- ASSOC
+    sub s1 s2@TAssoc {} = do
+        printRule "ASSOC-R"
hunk ./FrontEnd/Tc/Unify.hs 129
-        (s1,_,_) <- unbox s1
-        (s2,_,_) <- unbox s2
+        s1 <- evalFullType s1
+        s2 <- evalFullType s2
hunk ./FrontEnd/Tc/Unify.hs 222
-        printRule "ASSOC-BIND"
-        -- are associated types tau?
-        varBind mv ta
+        ta' <- evalFullType ta
+        if mv `elem` freeVars ta' then do
+            printRule "ASSOC-OCCURS"
+            addPreds [IsEq ta' (TMetaVar mv)]
+         else do
+            printRule "ASSOC-BIND"
+            varBind mv ta'
hunk ./FrontEnd/Tc/Unify.hs 291
-    printRule $ "unify: " <> ppretty t1 <+> ppretty t2
+    printRule $ "unify: " <> ppretty t1' <+> ppretty t2'