@@ -38,7 +38,7 @@ import Control.Applicative
3838import Control.Arrow (first, second)
3939import Control.Monad.Except
4040import Control.Monad.State
41−import Data.List ((\\), find)
41+import Data.List ((\\), find, sortBy)
4242import Data.Maybe (catMaybes, mapMaybe, isJust)
4343
4444import qualified Data.Map as M
@@ -56,8 +56,14 @@ desugarTypeClasses = flip evalStateT M.empty . mapM desugarModule
5656
5757desugarModule :: (Functor m, Applicative m, MonadSupply m, MonadError ErrorStack m) => Module -> Desugar m Module
5858desugarModule (Module coms name decls (Just exps)) = do
59− (newExpss, declss) <- unzip <$> parU decls (desugarDecl name exps)
59+ (newExpss, declss) <- unzip <$> parU (sortBy classesFirst decls) (desugarDecl name exps)
6060 return $ Module coms name (concat declss) $ Just (exps ++ catMaybes newExpss)
61+ where
62+ classesFirst :: Declaration -> Declaration -> Ordering
63+ classesFirst d1 d2
64+ | isTypeClassDeclaration d1 && not (isTypeClassDeclaration d2) = LT
65+ | not (isTypeClassDeclaration d1) && isTypeClassDeclaration d2 = GT
66+ | otherwise = EQ
6167desugarModule _ = error "Exports should have been elaborated in name desugaring"
6268
6369{- Desugar type class and type class instance declarations