pub fn infer( type_system: &mut TypeSystem, expr: &Expr, ) -> Result<(Vec<Predicate>, Type), TypeError>