unify (Primitive a) (Primitive b) | a == b = return idSub
unify a b = fail $ "cannot unify " ++ show a ++ " with " ++ show b
+tiLit :: Literal -> TI (Substitution, Type)
+tiLit (LBool _) = return (idSub, Primitive "Bool")
+tiLit (LInt _) = return (idSub, Primitive "Integer")
+tiLit (LFunc If) = do
+ a <- newVar
+ return (idSub, Primitive "Bool" `TypeFunction` (a `TypeFunction` (a `TypeFunction` a)))
+
ti :: TypeEnv -> TypedTerm -> TI (Substitution, Type)
---ti _ (TTerm (Var v) (TScheme t@(Primitive _))) = return (idSub, t)
ti e (TTerm tr sch) = do
(s, t) <- ti e (NTTerm tr)
sch' <- instantiate sch
s' <- unify t sch'
return (s', substituteT s' sch')
+ti _ (NTTerm (Lit l)) = tiLit l
ti e (NTTerm (Var v)) = case Map.lookup v e of
Nothing -> fail $ "unbound variable: " ++ v
Just sigma -> do