@@ -65,25 +65,15 @@ generalize youngPool = do
65-- move deeper into a variable.
65-- move deeper into a variable.
66adjustRank :: Int -> Int -> Int -> Variable -> StateT TS.SolverState IO Int
66adjustRank :: Int -> Int -> Int -> Variable -> StateT TS.SolverState IO Int
67adjustRank youngMark visitedMark groupRank variable =
67adjustRank youngMark visitedMark groupRank variable =
68− let adjust = adjustRank youngMark visitedMark groupRank in
69 do desc <- liftIO $ UF.descriptor variable
68 do desc <- liftIO $ UF.descriptor variable
70 case () of
69 case () of
71 () | mark desc == youngMark ->
70 () | mark desc == youngMark ->
72 do -- Set the variable as marked first because it may be cyclic.
71 do -- Set the variable as marked first because it may be cyclic.
73− liftIO $ UF.modifyDescriptor variable $ \desc -> desc { mark = visitedMark }
72+ liftIO $ UF.modifyDescriptor variable $ \desc ->
74− rank' <- case structure desc of
73+ desc { mark = visitedMark }
75− Nothing -> return groupRank
74+ rank' <- maybe (return groupRank) adjustTerm (structure desc)
78− App1 a b -> max `liftM` adjust a `ap` adjust b
79− Fun1 a b -> max `liftM` adjust a `ap` adjust b
81− EmptyRecord1 -> return outermostRank
82− Record1 fields extension ->
83− do ranks <- mapM adjust (concat (Map.elems fields))
84− rnk <- adjust extension
85− return . maximum $ rnk : ranks
86− liftIO $ UF.modifyDescriptor variable $ \desc -> desc { rank = rank' }
75+ liftIO $ UF.modifyDescriptor variable $ \desc ->
76+ desc { rank = rank' }
87 return rank'
77 return rank'
89 | mark desc /= visitedMark ->
79 | mark desc /= visitedMark ->
@@ -93,6 +83,19 @@ adjustRank youngMark visitedMark groupRank variable =
94 | otherwise -> return (rank desc)
84 | otherwise -> return (rank desc)
87+ adjust = adjustRank youngMark visitedMark groupRank
91+ App1 a b -> max `liftM` adjust a `ap` adjust b
92+ Fun1 a b -> max `liftM` adjust a `ap` adjust b
94+ EmptyRecord1 -> return outermostRank
95+ Record1 fields extension ->
96+ do ranks <- mapM adjust (concat (Map.elems fields))
97+ rnk <- adjust extension
98+ return . maximum $ rnk : ranks
98solve :: TypeConstraint -> StateT TS.SolverState IO ()
101solve :: TypeConstraint -> StateT TS.SolverState IO ()