Guest User

Untitled

a guest
Dec 14th, 2017
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.19 KB | None | 0 0
  1. equations' :: (MonadError String m) => Env -> Expr -> Type -> [Symb] -> m [(Type,Type)]
  2. equations' (Env env) (Var s) t bad = do
  3. let res = lookup s env
  4. case res of {(Just r) -> return $ [(t, r)] ;
  5. Nothing -> throwError $ "There is no variable " ++ (show s) ++ " in the enviroment."}
  6.  
  7.  
  8. equations' e@(Env env) expr@(m :@ n) t bad = do
  9. e1 <- (equations' e m (TVar alpha :-> t) (alpha : bad ++ allVars expr ++ freeTVarsEnv e))
  10. e2 <- (equations' e n (TVar alpha) (alpha : bad ++ allVars expr ++ freeTVarsEnv e))
  11. return $ e1 ++ e2
  12. where alpha = getNext' (bad ++ allVars expr ++ freeTVarsEnv e)
  13. --beta = getNext' expr (alpha : bad)
  14.  
  15. equations' e@(Env env) expr@(Lam x mm) t bad = do
  16. e1 <- (equations' (Env $ (x, TVar alpha) : env) mm (TVar beta) (alpha : beta : bad ++ allVars expr ++ freeTVarsEnv e))
  17. return $ (TVar alpha :-> TVar beta, t) : e1
  18. where alpha = getNext' (bad ++ allVars expr ++ freeTVarsEnv e)
  19. beta = getNext' (alpha : bad ++ allVars expr ++ freeTVarsEnv e)
  20.  
  21.  
  22.  
  23. allVars :: Expr -> [Symb]
  24. allVars (Var v) = [v]
  25. allVars (e1 :@ e2) = (allVars e1) ++ (allVars e2)
  26. allVars (Lam s e) = s : (allVars e)
  27.  
  28. principlePair :: (MonadError String m) => Expr -> m (Env,Type)
  29. principlePair expr = do
  30. let env = [(a, TVar (a ++ "name")) | a <- freeVars expr]
  31. let bad = [a ++ "name" | a <- freeVars expr]
  32. eqs <- equations' (Env env) expr (TVar "answertype") bad
  33. res <- unif2 eqs (SubsTy [])
  34. return $ (appSubsEnv res (Env env), appSubsTy res (TVar "answertype"))
  35.  
  36. unif2 :: (MonadError String m) => [(Type,Type)] -> SubsTy -> m SubsTy
  37. unif2 ((a, b):xs) s = do
  38. g <- unify (appSubsTy s a) (appSubsTy s b)
  39. unif2 xs (composeSubsTy g s)
  40. unif2 [] s = return s
  41.  
  42. l = 5 `replicateM` "abcdefghijklmnopqrstuvwxyz012346789"
  43. getNext' bad = head (l \\ bad)
Add Comment
Please, Sign In to add comment