X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=sem.icl;h=a58b2e111e9573947e14227c3dc0df3f7e24b45b;hb=6d70a636ed3b4573c4c81ba068ae2b46523c9465;hp=3438810cc3b0b5e6a62a2bd760ba9b0eda4c3844;hpb=bf8de26a347182ab0de1aa45a5cc3fdf6c320c21;p=cc1516.git diff --git a/sem.icl b/sem.icl index 3438810..a58b2e1 100644 --- a/sem.icl +++ b/sem.icl @@ -59,18 +59,29 @@ semFunDecl fd=:(FunDecl p f args mt vds stmts) = matchFunctions args ft >>= \tres-> mapM semVarDecl vds >>= \newvds-> mapM (checkStmt tres) stmts >>= \newstmts-> - inferReturnType stmts >>= \returntype-> + inferReturnType stmts >>= \returntype`-> + unify returntype` tres >>= \returntype-> case mt of Nothing = reconstructType args tres + >>= \ftype`->recoverType ftype` >>= \ftype->restoreGamma gamma >>| putIdent f ftype >>| pure ( FunDecl p f args (Just ftype) newvds newstmts) Just t = restoreGamma gamma >>| updateFunType t returntype >>= \tt-> pure (FunDecl p f args (Just tt) newvds newstmts) +recoverType :: Type -> Env Type +recoverType (IdType ident) = gets (\(st, r)->'Map'.get ident st) + >>= \mt->case mt of + Nothing = pure (IdType ident) + Just t = pure t +recoverType (t1 ->> t2) = recoverType t1 >>= \t1`->recoverType t2 + >>= \t2`->pure (t1` ->> t2`) +recoverType t = pure t + updateFunType :: Type Type -> Env Type +updateFunType (t1 ->> t2) t3 = updateFunType t2 t3 >>= \t2`->pure $ t1 ->> t2` updateFunType t1 t2 = unify t1 t2 -updateFunType (t1 ->> t2) t3 = t1 ->> (updateFunType t2 t3) inferReturnType :: [Stmt] -> Env Type inferReturnType [] = pure VoidType @@ -206,9 +217,9 @@ instance unify Type where unify (ListType t1) (ListType t2) = unify t1 t2 >>| (pure $ ListType t1) unify (ta1 ->> ta2) (tb1 ->> tb2) = unify ta1 tb1 >>= \ta-> unify ta2 tb2 >>= \tb-> pure (ta ->> tb) + unify VoidType VoidType = pure VoidType unify VoidType t = pure t unify t VoidType = pure t - unify VoidType VoidType = pure VoidType unify t1 t2 = liftT $ Left $ UnifyError zero t1 t2 instance zero Pos where