@@ -44,6 +44,7 @@ import Control.Applicative
4444import Control.Arrow (Arrow(..))
4545
4646import qualified Data.Map as M
47+import Data.Function (on)
4748
4849instance Unifiable Type where
4950 unknown = TUnknown
@@ -139,17 +140,7 @@ unifyRows r1 r2 =
139140 unifyRows' sd3 r3 sd4 r4 = throwError $ "Cannot unify " ++ prettyPrintRow (rowFromList (sd3, r3)) ++ " with " ++ prettyPrintRow (rowFromList (sd4, r4)) ++ "."
140141
141142typeConstructorsAreEqual :: Environment -> ModuleName -> Qualified ProperName -> Qualified ProperName -> Bool
142−typeConstructorsAreEqual env moduleName c1 c2 =
143− let
144− c1' = qualify moduleName c1
145− c2' = qualify moduleName c2
146− in
147− canonicalize env c1' == canonicalize env c2'
148− where
149− canonicalize :: Environment -> (ModuleName, ProperName) -> (ModuleName, ProperName)
150− canonicalize _ key = case key `M.lookup` types env of
151− Just (_, DataAlias mn' pn') -> (mn', pn')
152− _ -> key
143+typeConstructorsAreEqual env moduleName = (==) `on` canonicalizeType moduleName env
153144
154145typesOf :: ModuleName -> [(Ident, Value)] -> Check [Type]
155146typesOf moduleName vals = do
@@ -240,8 +231,8 @@ replaceAllTypeSynonyms :: (Functor m, MonadState CheckState m, MonadReader Subst
240231replaceAllTypeSynonyms d = do
241232 env <- getEnv
242233 moduleName <- substCurrentModule <$> ask
243− let syns = map (\((path, name), (args, _)) -> (Qualified (Just path) name, length args)) . M.toList $ typeSynonyms env
244− either throwError return $ saturateAllTypeSynonyms moduleName syns d
234+ let syns = map (\((path, name), (args, _)) -> ((path, name), length args)) . M.toList $ typeSynonyms env
235+ either throwError return $ saturateAllTypeSynonyms env moduleName syns d
245236
246237desaturateAllTypeSynonyms :: (D.Data d) => d -> d
247238desaturateAllTypeSynonyms = everywhere (mkT replaceSaturatedTypeSynonym)
@@ -253,7 +244,7 @@ expandTypeSynonym :: Qualified ProperName -> [Type] -> Subst Type
253244expandTypeSynonym name args = do
254245 env <- getEnv
255246 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
257248 Just (synArgs, body) -> return $ replaceAllTypeVars (zip synArgs args) body
258249 Nothing -> error "Type synonym was not defined"
259250