-
-//// ------------------------
-//// First step: Inference
-//// ------------------------//
-
-//unify :: Type Type -> Infer ()
-//unify t1 t2 = tell [(t1, t2)]//
-
-//fresh :: Infer Type
-//fresh = (gets id) >>= \vars-> (put $ tail vars) >>| (pure $ IdType $ head vars)//
-
-//op2Type :: Op2 -> Infer Type
-//op2Type op
-//| elem op [BiPlus, BiMinus, BiTimes, BiDivide, BiMod]
-// = pure (IntType ->> IntType ->> IntType)
-//| elem op [BiEquals, BiUnEqual]
-// = fresh >>= \t1-> fresh >>= \t2-> pure (t1 ->> t2 ->> BoolType)
-//| elem op [BiLesser, BiGreater, BiLesserEq, BiGreaterEq]
-// = pure (IntType ->> IntType ->> BoolType)
-//| elem op [BiAnd, BiOr]
-// = pure (BoolType ->> BoolType ->> BoolType)
-//| op == BiCons
-// = fresh >>= \t1-> pure (t1 ->> ListType t1 ->> ListType t1)//
-
-//op1Type :: Op1 -> Infer Type
-//op1Type UnNegation = pure $ (BoolType ->> BoolType)
-//op1Type UnMinus = pure $ (IntType ->> IntType)//
-
-////instantiate :: Scheme -> Infer Type
-////instantiate (Forall as t) = mapM (const fresh) as//
-
-//lookupEnv :: String -> Infer Type
-//lookupEnv ident = asks ('Map'.get ident)
-// >>= \m->case m of
-// Nothing = liftT $ Left $ UndeclaredVariableError zero ident
-// Just (Forall as t) = pure t //instantiate ???//
-
-//class infer a :: a -> Infer Type
-//instance infer Expr where
-// infer (VarExpr _ (VarDef ident fs)) = lookupEnv ident
-// infer (Op2Expr _ e1 op e2) =
-// infer e1 >>= \t1 ->
-// infer e2 >>= \t2 ->
-// fresh >>= \frsh ->
-// let given = t1 ->> (t2 ->> frsh) in
-// op2Type op >>= \expected ->
-// unify expected given >>|
-// return frsh
-// infer (Op1Expr _ op e) =
-// infer e >>= \t1 ->
-// fresh >>= \frsh ->
-// let given = t1 ->> frsh in
-// op1Type op >>= \expected ->
-// unify expected given >>|
-// pure frsh
-// infer (IntExpr _ _) = pure IntType
-// infer (CharExpr _ _) = pure CharType
-// infer (BoolExpr _ _) = pure BoolType
-// infer (FunExpr _ f args sels) = //todo, iets met field selectors
-// lookupEnv f >>= \expected ->
-// fresh >>= \frsh ->
-// mapM infer args >>= \argTypes ->
-// let given = foldr (->>) frsh argTypes in
-// unify expected given >>|
-// pure frsh
-// infer (EmptyListExpr _) = ListType <$> fresh
-// infer (TupleExpr _ (e1, e2)) =
-// infer e1 >>= \et1->infer e2 >>= \et2->pure $ TupleType (et1, et2)//
-
-////:: VarDef = VarDef String [FieldSelector]
-////:: FieldSelector = FieldHd | FieldTl | FieldFst | FieldSnd
-////:: Op1 = UnNegation | UnMinus
-////:: Op2 = BiPlus | BiMinus | BiTimes | BiDivide | BiMod | BiEquals | BiLesser |
-//// BiGreater | BiLesserEq | BiGreaterEq | BiUnEqual | BiAnd | BiOr | BiCons
-////:: FunDecl = FunDecl Pos String [String] (Maybe Type) [VarDecl] [Stmt]
-////:: FunCall = FunCall String [Expr]
-////:: Stmt
-//// = IfStmt Expr [Stmt] [Stmt]
-//// | WhileStmt Expr [Stmt]
-//// | AssStmt VarDef Expr
-//// | FunStmt FunCall
-//// | ReturnStmt (Maybe Expr)
-////:: Pos = {line :: Int, col :: Int}
-////:: AST = AST [VarDecl] [FunDecl]
-////:: VarDecl = VarDecl Pos Type String Expr
-////:: Type
-//// = TupleType (Type, Type)
-//// | ListType Type
-//// | IdType String
-//// | IntType
-//// | BoolType
-//// | CharType
-//// | VarType
-//// | VoidType
-//// | (->>) infixl 7 Type Type