From 574225a0f321ced5b99ca8333c1b9d0a06ef35cf Mon Sep 17 00:00:00 2001 From: Yuri Tatishchev Date: Thu, 23 Apr 2026 01:53:08 -0700 Subject: [PATCH] lab16: impl --- lab16/stlc.hs | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/lab16/stlc.hs b/lab16/stlc.hs index 08be30c..413ea08 100644 --- a/lab16/stlc.hs +++ b/lab16/stlc.hs @@ -51,10 +51,19 @@ typecheck e@(EIf e1 e2 e3) env = t2 = typecheck e2 env t3 = typecheck e3 env in if t1 == TBool && t2 == t3 then t2 else typecheckFail e -typecheck e@(EIsZero e1) env = error "TBD" -typecheck e@(EVar x) env = error "TBD" -typecheck e@(ELambda x tin e') env = error "TBD" -typecheck e@(EApp e1 e2) env = error "TBD" +typecheck e@(EIsZero e1) env = case typecheck e1 env of + TInt -> TBool + _ -> typecheckFail e +typecheck e@(EVar x) env = case Map.lookup x env of + Just t -> t + Nothing -> typecheckFail e +typecheck e@(ELambda x tin e') env = + let env' = Map.insert x tin env + in TFun tin (typecheck e' env') +typecheck e@(EApp e1 e2) env = + let t1@(TFun tin tout) = typecheck e1 env + t2 = typecheck e2 env + in if t2 == tin then tout else typecheckFail e --Some sample cases @@ -67,3 +76,13 @@ test5 = typecheck (EApp (ELambda "x" TInt (EIf (EIsZero (EVar "x")) (ESucc zero) bad1 = typecheck (ESucc EFalse) Map.empty bad2 = typecheck (EApp (ELambda "x" TInt (EIsZero (EVar "x"))) ETrue) Map.empty +-- main + +main = do + print test1 + print test2 + print test3 + print test4 + print test5 + print bad1 + print bad2