-typeOp1 :: Pos Expr Type -> Env Type
-typeOp1 p expr rtype = unify rtype expr
-
-typeExpr :: Expr -> Env Type
-typeExpr (IntExpr _ _) = pure $ Right IntType
-typeExpr (CharExpr _ _) = pure $ Right CharType
-typeExpr (BoolExpr _ _) = pure $ Right BoolType
-typeExpr (Op1Expr p UnNegation expr) = typeOp1 p expr BoolType
-typeExpr (Op1Expr p UnMinus expr) = typeOp1 p expr IntType
-typeExpr (TupleExpr p (e1, e2)) = typeExpr e1
- >>= \ete1->typeExpr e2 >>= \ete2->pure (
- ete1 >>= \te1->ete2 >>= \te2->Right $ TupleType (te1, te2))
-//typeExpr (Op2Expr Pos Expr Op2 Expr) = undef
-//typeExpr (FunExpr Pos FunCall) = undef
-//typeExpr (EmptyListExpr Pos) = undef
-//typeExpr (VarExpr Pos VarDef) = undef
-
-class unify a :: Type a -> Env Type
-
-instance unify Expr where
- unify (_ ->> _) e = pure $ Left $ ParseError (extrPos e)
- "Expression cannot be a higher order function. Yet..."
- unify VoidType e = pure $ Left $ ParseError (extrPos e)
- "Expression cannot be a Void type."
- unify (IdType _) e = pure $ Left $ ParseError (extrPos e)
- "Expression cannot be an polymorf type."
- unify t e = typeExpr e
- >>= \eithertype->case eithertype of
- Left e = pure $ Left e
- Right tex = unify t tex >>= \eitherun->case eitherun of
- Left err = pure $ Left $ decErr e err
- Right t = pure $ Right t
-
-instance unify Type where
- unify IntType IntType = pure $ Right IntType
- unify BoolType BoolType = pure $ Right BoolType
- unify CharType CharType = pure $ Right CharType
- unify t1 t2 = pure $ Left $ UnifyError zero t1 t2
-
-instance zero Pos where
- zero = {line=0,col=0}
-
-decErr :: Expr SemError -> SemError
-decErr e (UnifyError _ t1 t2) = UnifyError (extrPos e) t1 t2
-decErr e (ParseError _ s) = ParseError (extrPos e) s
-decErr e err = err
-
-extrPos :: Expr -> Pos
-extrPos (VarExpr p _) = p
-extrPos (Op2Expr p _ _ _) = p
-extrPos (Op1Expr p _ _) = p
-extrPos (IntExpr p _) = p
-extrPos (CharExpr p _) = p
-extrPos (BoolExpr p _) = p
-extrPos (FunExpr p _) = p
-extrPos (EmptyListExpr p) = p
-extrPos (TupleExpr p _) = p