empty list type check fix, add typecheck to forward step (no tests yet)

This commit is contained in:
ProgramSnail 2025-11-05 02:36:33 +03:00
parent edc6c373b0
commit 753ca23cbc
2 changed files with 23 additions and 12 deletions

View file

@ -18,6 +18,11 @@ isList x | ListT {} <- typeOf x = True
isTree x | TreeT {} <- typeOf x = True
| otherwise = False
simpleUnify :: Type -> Type -> Maybe Type
simpleUnify AnyT u = Just u
simpleUnify t AnyT = Just t
simpleUnify _ _ = Nothing
checkType :: TypeConf -> Expr -> Maybe Type
checkType conf (left :&&: right) = do BoolT <- checkType conf left
BoolT <- checkType conf right
@ -49,18 +54,22 @@ checkType conf ZeroE = return IntT
checkType conf (Div2E e) = do IntT <- checkType conf e
return IntT
checkType conf (TailE e) = do ListT t <- checkType conf e
guard $ t /= AnyT -- NOTE: can't take tail from list that is provem empty (?)
-- TODO: check that AnyT is only for empty list & no bad consequences
return $ ListT t
checkType conf (HeadE e) = do ListT t <- checkType conf e
guard $ t /= AnyT -- NOTE: can't take elem from list that is provem empty (?)
-- TODO: check that AnyT is only for empty list & no bad consequences
return t
checkType conf (left :++: right) = do ListT t <- checkType conf left
ListT u <- checkType conf right
guard $ t == u
return $ ListT t
w <- simpleUnify t u
return $ ListT w
checkType conf (left ::: right) = do t <- checkType conf left
ListT u <- checkType conf right
guard $ t == u
return $ ListT t
checkType conf EmptyListE = return $ ListT AnyT -- TODO FIXME: deal with AnyT
w <- simpleUnify t u
return $ ListT w
checkType conf EmptyListE = return $ ListT AnyT -- NOTE: ListT AnyT - type of generic empty list
checkType conf (IsLeafE e) = do TreeT _ <- checkType conf e
return BoolT
checkType conf (TreeValE e) = do TreeT t <- checkType conf e