unify (IdType _) e = liftT $ Left $ ParseError (extrPos e)
"Expression cannot be an polymorf type."
unify VarType e = typeExpr e
+ unify (IdType i) e = undef
//we have to cheat to decorate the error, can be done nicer?
unify t e = StateT $ \s0 -> let res = runStateT m s0 in case res of
Left err = Left $ decErr e err
Right t = Right t //note, t :: (Type, Gamma)
where m = typeExpr e >>= \tex-> unify t tex
-
+replace :: String Type -> Env Void
+replace _ _ = undef
instance unify Type where
unify IntType IntType = pure IntType
unify BoolType BoolType = pure BoolType
unify CharType CharType = pure CharType
- //unify t (IdType i) = unify (IdType i) t
- //note, don't use putIdent as that will call unify again
- //unify (IdType i) e=:(IdType j) = modify (\(st, r)->('Map'.put j e st, r))
+ unify (IdType i) t=:(IdType j) = replace i t >>| pure t
+ unify t (IdType i) = unify (IdType i) t
+ unify (IdType i) t = replace i t >>| pure t
//unify (ListType t1) (ListType t2) = unify t1 t2
unify t1 t2 = liftT $ Left $ UnifyError zero t1 t2