@@ -9,40 +9,40 @@ import Language.SystemF.Expression
99type UniqueSupply n = [n ]
1010type Context n t = Map n t
1111
12- typecheck :: (Ord n , Eq t , PrettyPrint t )
13- => UniqueSupply t
14- -> Context n (Ty t )
15- -> SystemFExpr n t
16- -> Either String (Ty t )
12+ typecheck :: (Ord n , Eq n , PrettyPrint n )
13+ => UniqueSupply n
14+ -> Context n (Ty n )
15+ -> SystemFExpr n n
16+ -> Either String (Ty n )
1717typecheck uniqs ctx (Var v) = tcVar uniqs ctx v
1818typecheck uniqs ctx (Abs n t body) = tcAbs uniqs ctx n t body
1919typecheck uniqs ctx (App e1 e2) = tcApp uniqs ctx e1 e2
2020typecheck uniqs ctx (TyAbs t body) = tcTyAbs uniqs ctx t body
2121typecheck _ _ _ = undefined
2222
23- tcVar :: (Ord n , Eq t , PrettyPrint t )
24- => UniqueSupply t
25- -> Context n (Ty t )
23+ tcVar :: (Ord n , Eq n , PrettyPrint n )
24+ => UniqueSupply n
25+ -> Context n (Ty n )
2626 -> n
27- -> Either String (Ty t )
27+ -> Either String (Ty n )
2828tcVar uniqs ctx var = maybe (TyVar <$> unique uniqs) return (lookup var ctx)
2929
30- tcAbs :: (Ord n , Eq t , PrettyPrint t )
31- => UniqueSupply t
32- -> Context n (Ty t )
30+ tcAbs :: (Ord n , Eq n , PrettyPrint n )
31+ => UniqueSupply n
32+ -> Context n (Ty n )
3333 -> n
34- -> Ty t
35- -> SystemFExpr n t
36- -> Either String (Ty t )
34+ -> Ty n
35+ -> SystemFExpr n n
36+ -> Either String (Ty n )
3737tcAbs uniqs ctx name ty body = TyArrow ty <$> typecheck uniqs ctx' body
3838 where ctx' = insert name ty ctx
3939
40- tcApp :: (Ord n , Eq t , PrettyPrint t )
41- => UniqueSupply t
42- -> Context n (Ty t )
43- -> SystemFExpr n t
44- -> SystemFExpr n t
45- -> Either String (Ty t )
40+ tcApp :: (Ord n , Eq n , PrettyPrint n )
41+ => UniqueSupply n
42+ -> Context n (Ty n )
43+ -> SystemFExpr n n
44+ -> SystemFExpr n n
45+ -> Either String (Ty n )
4646tcApp uniqs ctx e1 e2 = do
4747 t1 <- typecheck uniqs ctx e1
4848 t2 <- typecheck uniqs ctx e2
@@ -58,13 +58,14 @@ tcApp uniqs ctx e1 e2 = do
5858 arrow (TyArrow t1 t2) = return (t1, t2)
5959 arrow t = Left t
6060
61- tcTyAbs :: (Ord n , Eq t , PrettyPrint t )
62- => UniqueSupply t
63- -> Context n (Ty t )
64- -> t
65- -> SystemFExpr n t
66- -> Either String (Ty t )
67- tcTyAbs uniqs ctx ty body = undefined
61+ tcTyAbs :: (Ord n , Eq n , PrettyPrint n )
62+ => UniqueSupply n
63+ -> Context n (Ty n )
64+ -> n
65+ -> SystemFExpr n n
66+ -> Either String (Ty n )
67+ tcTyAbs uniqs ctx ty body = TyForAll ty <$> typecheck uniqs ctx' body
68+ where ctx' = insert ty (TyVar ty) ctx
6869
6970-- Utilities
7071unique :: UniqueSupply t
0 commit comments