@@ -44,6 +44,7 @@ import Control.Applicative
44import Control.Arrow (Arrow(..))
44import Control.Arrow (Arrow(..))
46import qualified Data.Map as M
46import qualified Data.Map as M
47+import Data.Function (on)
48instance Unifiable Type where
49instance Unifiable Type where
49 unknown = TUnknown
50 unknown = TUnknown
@@ -139,17 +140,7 @@ unifyRows r1 r2 =
139 unifyRows' sd3 r3 sd4 r4 = throwError $ "Cannot unify " ++ prettyPrintRow (rowFromList (sd3, r3)) ++ " with " ++ prettyPrintRow (rowFromList (sd4, r4)) ++ "."
140 unifyRows' sd3 r3 sd4 r4 = throwError $ "Cannot unify " ++ prettyPrintRow (rowFromList (sd3, r3)) ++ " with " ++ prettyPrintRow (rowFromList (sd4, r4)) ++ "."
141typeConstructorsAreEqual :: Environment -> ModuleName -> Qualified ProperName -> Qualified ProperName -> Bool
142typeConstructorsAreEqual :: Environment -> ModuleName -> Qualified ProperName -> Qualified ProperName -> Bool
142−typeConstructorsAreEqual env moduleName c1 c2 =
143+typeConstructorsAreEqual env moduleName = (==) `on` canonicalizeType moduleName env
144− c1' = qualify moduleName c1
145− c2' = qualify moduleName c2
147− canonicalize env c1' == canonicalize env c2'
149− canonicalize :: Environment -> (ModuleName, ProperName) -> (ModuleName, ProperName)
150− canonicalize _ key = case key `M.lookup` types env of
151− Just (_, DataAlias mn' pn') -> (mn', pn')
154typesOf :: ModuleName -> [(Ident, Value)] -> Check [Type]
145typesOf :: ModuleName -> [(Ident, Value)] -> Check [Type]
155typesOf moduleName vals = do
146typesOf moduleName vals = do
@@ -240,8 +231,8 @@ replaceAllTypeSynonyms :: (Functor m, MonadState CheckState m, MonadReader Subst
240replaceAllTypeSynonyms d = do
231replaceAllTypeSynonyms d = do
241 env <- getEnv
232 env <- getEnv
242 moduleName <- substCurrentModule <$> ask
233 moduleName <- substCurrentModule <$> ask
243− let syns = map (\((path, name), (args, _)) -> (Qualified (Just path) name, length args)) . M.toList $ typeSynonyms env
234+ let syns = map (\((path, name), (args, _)) -> ((path, name), length args)) . M.toList $ typeSynonyms env
244− either throwError return $ saturateAllTypeSynonyms moduleName syns d
235+ either throwError return $ saturateAllTypeSynonyms env moduleName syns d
246desaturateAllTypeSynonyms :: (D.Data d) => d -> d
237desaturateAllTypeSynonyms :: (D.Data d) => d -> d
247desaturateAllTypeSynonyms = everywhere (mkT replaceSaturatedTypeSynonym)
238desaturateAllTypeSynonyms = everywhere (mkT replaceSaturatedTypeSynonym)
@@ -253,7 +244,7 @@ expandTypeSynonym :: Qualified ProperName -> [Type] -> Subst Type
253expandTypeSynonym name args = do
244expandTypeSynonym name args = do
254 env <- getEnv
245 env <- getEnv
255 moduleName <- substCurrentModule `fmap` ask
246 moduleName <- substCurrentModule `fmap` ask
256− case M.lookup (qualify moduleName name) (typeSynonyms env) of
247+ case M.lookup (canonicalizeType moduleName env name) (typeSynonyms env) of
257 Just (synArgs, body) -> return $ replaceAllTypeVars (zip synArgs args) body
248 Just (synArgs, body) -> return $ replaceAllTypeVars (zip synArgs args) body
258 Nothing -> error "Type synonym was not defined"
249 Nothing -> error "Type synonym was not defined"