documented possible bad functions

This commit is contained in:
sebastianselander 2023-03-06 16:41:59 +01:00
parent eef6fa7668
commit fce54e7899
2 changed files with 17 additions and 22 deletions

View file

@ -1,17 +1,8 @@
-- double : _Int -> _Int ;
-- double n = n + n;
apply : ('a -> 'b -> 'c) -> 'a -> 'b -> 'c ;
apply f x y = f x y ;
id : 'a -> 'a ;
id x = x ;
add : _Int -> _Int -> _Int ;
add x y = x + y ;
main : _Int -> _Int -> _Int ;
main = apply (id add) ;
idadd : _Int -> _Int -> _Int ;
idadd = id add ;
main : ('a -> 'b -> 'c) ;
main = id ;

View file

@ -45,6 +45,7 @@ typecheck = run . checkPrg
{- | Start by freshening the type variable of data types to avoid clash with
other user defined polymorphic types
This might be wrong for type constructors that work over several variables
-}
freshenData :: Data -> Infer Data
freshenData (Data (Constr name ts) constrs) = do
@ -59,18 +60,21 @@ freshenData (Data (Constr name ts) constrs) = do
let new_ts = map (freshenType fr') ts
let new_constrs = map (freshenConstr fr') constrs
return $ Data (Constr name new_ts) new_constrs
where
freshenType :: Ident -> Type -> Type
freshenType iden = \case
(TPol _) -> TPol iden
(TArr a b) -> TArr (freshenType iden a) (freshenType iden b)
(TConstr (Constr a ts)) ->
TConstr (Constr a (map (freshenType iden) ts))
rest -> rest
freshenConstr :: Ident -> Constructor -> Constructor
freshenConstr iden (Constructor name t) =
Constructor name (freshenType iden t)
{- | Freshen all polymorphic variables, regardless of name
| freshenType "d" (a -> b -> c) becomes (d -> d -> d)
-}
freshenType :: Ident -> Type -> Type
freshenType iden = \case
(TPol _) -> TPol iden
(TArr a b) -> TArr (freshenType iden a) (freshenType iden b)
(TConstr (Constr a ts)) ->
TConstr (Constr a (map (freshenType iden) ts))
rest -> rest
freshenConstr :: Ident -> Constructor -> Constructor
freshenConstr iden (Constructor name t) =
Constructor name (freshenType iden t)
checkData :: Data -> Infer ()
checkData d = do