@@ -13,6 +13,7 @@ import Control.Monad.State
13import Control.Monad.Error
13import Control.Monad.Error
14import Data.Traversable (traverse)
14import Data.Traversable (traverse)
15import AST.Annotation
15import AST.Annotation
16+import qualified AST.PrettyPrint as PP
16import qualified AST.Type as T
17import qualified AST.Type as T
17import qualified AST.Variable as Var
18import qualified AST.Variable as Var
@@ -25,12 +26,18 @@ data Term1 a
25 deriving Show
26 deriving Show
27data TermN a
28data TermN a
28− = VarN a
29+ = VarN (Maybe Var.Canonical) a
29− | TermN (Term1 (TermN a))
30+ | TermN (Maybe Var.Canonical) (Term1 (TermN a))
30 deriving Show
31 deriving Show
36+termN :: (Term1 (TermN a)) -> TermN a
32record :: Map.Map String [TermN a] -> TermN a -> TermN a
39record :: 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)
35type Type = TermN Variable
42type Type = TermN Variable
36type Variable = UF.Point Descriptor
43type Variable = UF.Point Descriptor
@@ -71,9 +78,9 @@ a@(A _ c1) /\ b@(A _ c2) =
72infixr 9 ==>
79infixr 9 ==>
73(==>) :: Type -> Type -> Type
80(==>) :: Type -> Type -> Type
74−a ==> b = TermN (Fun1 a b)
81+a ==> b = termN (Fun1 a b)
76−f <| a = TermN (App1 f a)
83+f <| a = termN (App1 f a)
78data Descriptor = Descriptor
85data Descriptor = Descriptor
79 { structure :: Maybe (Term1 Variable)
86 { structure :: Maybe (Term1 Variable)
@@ -82,6 +89,7 @@ data Descriptor = Descriptor
82 , name :: Maybe TypeName
89 , name :: Maybe TypeName
83 , copy :: Maybe Variable
90 , copy :: Maybe Variable
84 , mark :: Int
91 , mark :: Int
92+ , alias :: Maybe Var.Canonical
85 } deriving Show
93 } deriving Show
87noRank = -1
95noRank = -1
@@ -104,6 +112,7 @@ namedVar flex name = UF.fresh $ Descriptor
104 , name = Just name
112 , name = Just name
105 , copy = Nothing
113 , copy = Nothing
106 , mark = noMark
114 , mark = noMark
109var :: Flex -> IO Variable
118var :: Flex -> IO Variable
@@ -114,6 +123,7 @@ var flex = UF.fresh $ Descriptor
114 , name = Nothing
123 , name = Nothing
115 , copy = Nothing
124 , copy = Nothing
116 , mark = noMark
125 , mark = noMark
@@ -130,12 +140,12 @@ fl rqs constraint@(A ann _) =
130exists :: Error e => (Type -> ErrorT e IO TypeConstraint) -> ErrorT e IO TypeConstraint
140exists :: Error e => (Type -> ErrorT e IO TypeConstraint) -> ErrorT e IO TypeConstraint
131exists f = do
141exists f = do
132 v <- liftIO $ var Flexible
142 v <- liftIO $ var Flexible
133− ex [v] <$> f (VarN v)
143+ ex [v] <$> f (varN v)
135existsNumber :: Error e => (Type -> ErrorT e IO TypeConstraint) -> ErrorT e IO TypeConstraint
145existsNumber :: Error e => (Type -> ErrorT e IO TypeConstraint) -> ErrorT e IO TypeConstraint
136existsNumber f = do
146existsNumber f = do
137 v <- liftIO $ var (Is Number)
147 v <- liftIO $ var (Is Number)
138− ex [v] <$> f (VarN v)
148+ ex [v] <$> f (varN v)
141instance Show a => Show (UF.Point a) where
151instance Show a => Show (UF.Point a) where
@@ -185,9 +195,13 @@ instance PrettyType a => PrettyType (Term1 a) where
185instance PrettyType a => PrettyType (TermN a) where
195instance PrettyType a => PrettyType (TermN a) where
186 pretty when term =
196 pretty when term =
187 case term of
197 case term of
188− VarN x -> pretty when x
198+ VarN alias x -> either alias (pretty when x)
189− TermN t1 -> pretty when t1
199+ TermN alias t1 -> either alias (pretty when t1)
201+ either maybeAlias doc =
203+ Just alias -> PP.pretty alias
192instance PrettyType Descriptor where
206instance PrettyType Descriptor where
193 pretty when desc =
207 pretty when desc =
@@ -321,8 +335,8 @@ instance (Crawl t, Crawl v) => Crawl (Scheme t v) where
321instance Crawl t => Crawl (TermN t) where
335instance Crawl t => Crawl (TermN t) where
322 crawl nextState tipe =
336 crawl nextState tipe =
323 case tipe of
337 case tipe of
324− VarN x -> VarN <$> crawl nextState x
338+ VarN a x -> VarN a <$> crawl nextState x
325− TermN term -> TermN <$> crawl nextState term
339+ TermN a term -> TermN a <$> crawl nextState term
327instance Crawl t => Crawl (Term1 t) where
341instance Crawl t => Crawl (Term1 t) where
328 crawl nextState term =
342 crawl nextState term =
@@ -355,7 +369,7 @@ toSrcType :: Variable -> IO T.CanonicalType
355toSrcType variable =
369toSrcType variable =
356 do desc <- UF.descriptor =<< addNames variable
370 do desc <- UF.descriptor =<< addNames variable
357 srcType <- maybe (backupSrcType desc) termToSrcType (structure desc)
371 srcType <- maybe (backupSrcType desc) termToSrcType (structure desc)
358− return srcType
372+ return $ maybe srcType (\name -> T.Aliased name srcType) (alias desc)
360 backupSrcType desc =
374 backupSrcType desc =
361 case name desc of
375 case name desc of
@@ -402,11 +416,11 @@ collectApps variable = go [] variable
402 desc <- UF.descriptor variable
416 desc <- UF.descriptor variable
403 case (structure desc, vars) of
417 case (structure desc, vars) of
404 (Nothing, [v]) -> case name desc of
418 (Nothing, [v]) -> case name desc of
405− Just n | Var.isList n -> return (List v)
419+ Just n | Var.isList n -> return (List v)
406− _ -> return Other
420+ _ -> return Other
407 (Nothing, vs) -> case name desc of
421 (Nothing, vs) -> case name desc of
408− Just n | Var.isTuple n -> return (Tuple vs)
422+ Just n | Var.isTuple n -> return (Tuple vs)
409− _ -> return Other
423+ _ -> return Other
410 (Just term, _) -> case term of
424 (Just term, _) -> case term of
411 App1 a b -> go (vars ++ [b]) a
425 App1 a b -> go (vars ++ [b]) a
412 _ -> return Other
426 _ -> return Other