Skip to content

Commit 965ea5d

Browse files
committed
Update SystemF typechecker
* Refactor types * Add Type Abstraction
1 parent f7e2b56 commit 965ea5d

File tree

2 files changed

+34
-30
lines changed

2 files changed

+34
-30
lines changed

src/Language/SystemF/TypeCheck.hs

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -9,40 +9,40 @@ import Language.SystemF.Expression
99
type UniqueSupply n = [n]
1010
type 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)
1717
typecheck uniqs ctx (Var v) = tcVar uniqs ctx v
1818
typecheck uniqs ctx (Abs n t body) = tcAbs uniqs ctx n t body
1919
typecheck uniqs ctx (App e1 e2) = tcApp uniqs ctx e1 e2
2020
typecheck uniqs ctx (TyAbs t body) = tcTyAbs uniqs ctx t body
2121
typecheck _ _ _ = 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)
2828
tcVar 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)
3737
tcAbs 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)
4646
tcApp 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
7071
unique :: UniqueSupply t

test/Language/SystemF/TypeCheckSpec.hs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,10 @@ spec = describe "typecheck" $ do
4747

4848
tc [] ctx (App (Var "f") (Var "b")) `shouldSatisfy` isLeft
4949

50-
it "typechecks simple type abstractions" $ do
51-
pendingWith "Not implemented"
50+
it "typechecks simple type abstractions" $
5251
tc ["A"] [] (TyAbs "X" (Var "x")) `shouldBe` Right (TyForAll "X" (TyVar "A"))
5352

53+
it "typechecks type abstractions with simple abstraction" $
54+
tc [] [] (TyAbs "X" (Abs "x" (TyVar "X") (Var "X"))) `shouldBe`
55+
Right (TyForAll "X" (TyArrow (TyVar "X") (TyVar "X")))
56+

0 commit comments

Comments
 (0)