@@ -13,43 +13,68 @@ import qualified AST.Variable as Var
13import Transform.Canonicalize.Environment
13import Transform.Canonicalize.Environment
14import qualified Transform.Canonicalize.Variable as Canonicalize
14import qualified Transform.Canonicalize.Variable as Canonicalize
16−tipe :: Environment -> T.RawType -> Canonicalizer String T.CanonicalType
20+ -> Canonicalizer String T.CanonicalType
17tipe env typ =
21tipe env typ =
18 let go = tipe env in
22 let go = tipe env in
19 case typ of
23 case typ of
20− T.Var x -> return (T.Var x)
25+ return (T.Var x)
21− T.Type _ -> canonicalizeApp env typ []
28+ canonicalizeApp env typ []
22− T.App t ts -> canonicalizeApp env t ts
31+ canonicalizeApp env t ts
24− T.Lambda a b -> T.Lambda <$> go a <*> go b
34+ T.Lambda <$> go a <*> go b
25− T.Aliased name t -> T.Aliased name <$> go t
37+ T.Aliased name <$> go t
27 T.Record fields ext ->
39 T.Record fields ext ->
28 let go' (f,t) = (,) f <$> go t
40 let go' (f,t) = (,) f <$> go t
29− in T.Record <$> mapM go' fields <*> traverse go ext
42+ T.Record <$> mapM go' fields <*> traverse go ext
31−canonicalizeApp :: Environment -> T.RawType -> [T.RawType]
45+canonicalizeApp
32− -> Canonicalizer String T.CanonicalType
49+ -> Canonicalizer String T.CanonicalType
33canonicalizeApp env f args =
50canonicalizeApp env f args =
35 T.Type (Var.Raw rawName) ->
52 T.Type (Var.Raw rawName) ->
36− do answer <- Canonicalize.tvar env rawName
53+ do answer <- Canonicalize.tvar env rawName
37− case answer of
54+ case answer of
38− Right alias -> canonicalizeAlias env alias args
56+ canonicalizeAlias env alias args
39− Left name -> case args of
59+ case args of
40− [] -> return (T.Type name)
60+ [] -> return (T.Type name)
41− _:_ -> T.App (T.Type name) <$> mapM (tipe env) args
62+ T.App (T.Type name) <$> mapM (tipe env) args
43− _ -> T.App <$> tipe env f <*> mapM (tipe env) args
65+ T.App <$> tipe env f <*> mapM (tipe env) args
45−canonicalizeAlias :: Environment -> (Var.Canonical, [String], T.CanonicalType)
70+ -> (Var.Canonical, [String], T.CanonicalType)
46− -> [T.RawType]
71+ -> [T.RawType]
47− -> Canonicalizer String T.CanonicalType
72+ -> Canonicalizer String T.CanonicalType
48canonicalizeAlias env (name, tvars, dealiasedTipe) tipes =
73canonicalizeAlias env (name, tvars, dealiasedTipe) tipes =
49− do when (tipesLen /= tvarsLen) (throwError msg)
74+ do when (tipesLen /= tvarsLen) (throwError msg)
50− tipes' <- mapM (tipe env) tipes
75+ tipes' <- mapM (tipe env) tipes
51− let tipe' = replace (Map.fromList (zip tvars tipes')) dealiasedTipe
76+ let tipe' = replace (Map.fromList (zip tvars tipes')) dealiasedTipe
52− return $ T.Aliased name tipe'
77+ return $ T.Aliased name tipe'
54 tipesLen = length tipes
79 tipesLen = length tipes
55 tvarsLen = length tvars
80 tvarsLen = length tvars