apply :: Env -> Expr -> Expr -> ThrowError Expr
-- ^ Nested application recursion
apply env a@(AppExpr _ _) args = do
    a' <- (eval env a)
    apply env a' args
-- ^Apply a function context to another arg. Basically there are two options:
-- The arguments suffice the function -> function is executed
-- There are too little arguemts -> context swallows argument and proceeds
apply :: Env -> Expr -> Expr -> ThrowError Expr
apply env a@(AppExpr _ _) args = do
    a' <- (eval env a)
    apply env a' args
-- ^Apply a function context to another arg. Basically there are two options:
-- The arguments suffice the function -> function is executed
-- There are too little arguemts -> context swallows argument and proceeds
apply env a@(AppExpr _ _) args = do
    a' <- (eval env a)
    apply env a' args
-- ^Apply a function context to another arg. Basically there are two options:
-- The arguments suffice the function -> function is executed
-- There are too little arguemts -> context swallows argument and proceeds