@@ -13,6 +13,7 @@ import Control.Monad.State
1313import Control.Monad.Error
1414import Data.Traversable (traverse)
1515import AST.Annotation
16+import qualified AST.PrettyPrint as PP
1617import qualified AST.Type as T
1718import qualified AST.Variable as Var
1819
@@ -25,12 +26,18 @@ data Term1 a
2526 deriving Show
2627
2728data TermN a
28− = VarN a
29− | TermN (Term1 (TermN a))
29+ = VarN (Maybe Var.Canonical) a
30+ | TermN (Maybe Var.Canonical) (Term1 (TermN a))
3031 deriving Show
3132
33+varN :: a -> TermN a
34+varN = VarN Nothing
35+
36+termN :: (Term1 (TermN a)) -> TermN a
37+termN = TermN Nothing
38+
3239record :: Map.Map String [TermN a] -> TermN a -> TermN a
33−record fs rec = TermN (Record1 fs rec)
40+record fs rec = termN (Record1 fs rec)
3441
3542type Type = TermN Variable
3643type Variable = UF.Point Descriptor
@@ -71,9 +78,9 @@ a@(A _ c1) /\ b@(A _ c2) =
7178
7279infixr 9 ==>
7380(==>) :: Type -> Type -> Type
74−a ==> b = TermN (Fun1 a b)
81+a ==> b = termN (Fun1 a b)
7582
76−f <| a = TermN (App1 f a)
83+f <| a = termN (App1 f a)
7784
7885data Descriptor = Descriptor
7986 { structure :: Maybe (Term1 Variable)
@@ -82,6 +89,7 @@ data Descriptor = Descriptor
8289 , name :: Maybe TypeName
8390 , copy :: Maybe Variable
8491 , mark :: Int
92+ , alias :: Maybe Var.Canonical
8593 } deriving Show
8694
8795noRank = -1
@@ -104,6 +112,7 @@ namedVar flex name = UF.fresh $ Descriptor
104112 , name = Just name
105113 , copy = Nothing
106114 , mark = noMark
115+ , alias = Nothing
107116 }
108117
109118var :: Flex -> IO Variable
@@ -114,6 +123,7 @@ var flex = UF.fresh $ Descriptor
114123 , name = Nothing
115124 , copy = Nothing
116125 , mark = noMark
126+ , alias = Nothing
117127 }
118128
119129
@@ -130,12 +140,12 @@ fl rqs constraint@(A ann _) =
130140exists :: Error e => (Type -> ErrorT e IO TypeConstraint) -> ErrorT e IO TypeConstraint
131141exists f = do
132142 v <- liftIO $ var Flexible
133− ex [v] <$> f (VarN v)
143+ ex [v] <$> f (varN v)
134144
135145existsNumber :: Error e => (Type -> ErrorT e IO TypeConstraint) -> ErrorT e IO TypeConstraint
136146existsNumber f = do
137147 v <- liftIO $ var (Is Number)
138− ex [v] <$> f (VarN v)
148+ ex [v] <$> f (varN v)
139149
140150
141151instance Show a => Show (UF.Point a) where
@@ -185,9 +195,13 @@ instance PrettyType a => PrettyType (Term1 a) where
185195instance PrettyType a => PrettyType (TermN a) where
186196 pretty when term =
187197 case term of
188− VarN x -> pretty when x
189− TermN t1 -> pretty when t1
190−
198+ VarN alias x -> either alias (pretty when x)
199+ TermN alias t1 -> either alias (pretty when t1)
200+ where
201+ either maybeAlias doc =
202+ case maybeAlias of
203+ Just alias -> PP.pretty alias
204+ Nothing -> doc
191205
192206instance PrettyType Descriptor where
193207 pretty when desc =
@@ -321,8 +335,8 @@ instance (Crawl t, Crawl v) => Crawl (Scheme t v) where
321335instance Crawl t => Crawl (TermN t) where
322336 crawl nextState tipe =
323337 case tipe of
324− VarN x -> VarN <$> crawl nextState x
325− TermN term -> TermN <$> crawl nextState term
338+ VarN a x -> VarN a <$> crawl nextState x
339+ TermN a term -> TermN a <$> crawl nextState term
326340
327341instance Crawl t => Crawl (Term1 t) where
328342 crawl nextState term =
@@ -355,7 +369,7 @@ toSrcType :: Variable -> IO T.CanonicalType
355369toSrcType variable =
356370 do desc <- UF.descriptor =<< addNames variable
357371 srcType <- maybe (backupSrcType desc) termToSrcType (structure desc)
358− return srcType
372+ return $ maybe srcType (\name -> T.Aliased name srcType) (alias desc)
359373 where
360374 backupSrcType desc =
361375 case name desc of
@@ -402,11 +416,11 @@ collectApps variable = go [] variable
402416 desc <- UF.descriptor variable
403417 case (structure desc, vars) of
404418 (Nothing, [v]) -> case name desc of
405− Just n | Var.isList n -> return (List v)
406− _ -> return Other
419+ Just n | Var.isList n -> return (List v)
420+ _ -> return Other
407421 (Nothing, vs) -> case name desc of
408− Just n | Var.isTuple n -> return (Tuple vs)
409− _ -> return Other
422+ Just n | Var.isTuple n -> return (Tuple vs)
423+ _ -> return Other
410424 (Just term, _) -> case term of
411425 App1 a b -> go (vars ++ [b]) a
412426 _ -> return Other