m :: Env ([VarDecl], [FunDecl])
m = mapM semVarDecl vd >>= \vd1 ->
mapM semFunDecl fd >>= \fd1 ->
-// mapM semVarDecl vd1 >>= \vd2 ->
-// mapM semFunDecl fd1 >>= \fd2 ->
-// mapM semVarDecl vd2 >>= \vd3 ->
-// mapM semFunDecl fd2 >>= \fd3 ->
-// mapM semVarDecl vd3 >>= \vd4 ->
-// mapM semFunDecl fd3 >>= \fd4 -> //Dit is puur om te proberen
- pure (vd1, fd1)
+ mapM semVarDecl vd1 >>= \vd2 ->
+ mapM semFunDecl fd1 >>= \fd2 ->
+ mapM semVarDecl vd2 >>= \vd3 ->
+ mapM semFunDecl fd2 >>= \fd3 ->
+ mapM semVarDecl vd3 >>= \vd4 ->
+ mapM semFunDecl fd3 >>= \fd4 -> //Dit is puur om te proberen
+ pure (vd4, fd4)
semFunDecl :: FunDecl -> Env FunDecl
semFunDecl fd=:(FunDecl p f args mt vds stmts) =
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
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