@@ -18,7 +18,7 @@ typecheck 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
21- typecheck _ _ _ = undefined
21+ typecheck uniqs ctx ( TyApp e ty) = tcTyApp uniqs ctx e ty
2222
2323tcVar :: (Ord n , Eq n , PrettyPrint n )
2424 => UniqueSupply n
@@ -67,12 +67,48 @@ tcTyAbs :: (Ord n, Eq n, PrettyPrint n)
6767tcTyAbs uniqs ctx ty body = TyForAll ty <$> typecheck uniqs ctx' body
6868 where ctx' = insert ty (TyVar ty) ctx
6969
70+ tcTyApp :: (Ord n , Eq n , PrettyPrint n )
71+ => UniqueSupply n
72+ -> Context n (Ty n )
73+ -> SystemFExpr n n
74+ -> Ty n
75+ -> Either String (Ty n )
76+ tcTyApp uniqs ctx (TyAbs t expr) ty = typecheck uniqs ctx expr'
77+ where expr' = sub t ty expr
78+ tcTyApp uniqs ctx expr ty = typecheck uniqs ctx expr
79+
7080-- Utilities
7181unique :: UniqueSupply t
7282 -> Either String t
7383unique (u: _) = return u
7484unique _ = fail " Unique supply ran out"
7585
86+ sub :: Eq n
87+ => n
88+ -> Ty n
89+ -> SystemFExpr n n
90+ -> SystemFExpr n n
91+ sub name ty (App e1 e2) = App (sub name ty e1) (sub name ty e2)
92+ sub name ty (Abs n ty' e) = Abs n (subTy name ty ty') (sub name ty e)
93+ sub name ty (TyAbs ty' e) = TyAbs ty' (sub name ty e)
94+ sub name ty (TyApp e ty') = TyApp (sub name ty e) (subTy name ty ty')
95+ sub name ty expr = expr
96+
97+ subTy :: Eq n
98+ => n
99+ -> Ty n
100+ -> Ty n
101+ -> Ty n
102+ subTy name ty (TyArrow t1 t2)
103+ = TyArrow (subTy name ty t1) (subTy name ty t2)
104+ subTy name ty ty'@ (TyVar name')
105+ | name == name' = ty
106+ | otherwise = ty'
107+ subTy name t1 t2@ (TyForAll name' t2')
108+ | name == name' = t2
109+ | otherwise = TyForAll name' (subTy name t2 t2')
110+
111+
76112tyMismatchMsg :: (PrettyPrint t , PrettyPrint t' )
77113 => t
78114 -> t'
0 commit comments