#[non_exhaustive]pub enum TypeError {
Mismatch {
expected: Type,
found: Type,
},
Occurs {
var: TyVar,
ty: Type,
},
}Expand description
The reason a unify call failed.
Unification fails in exactly two ways, each a distinct, defined outcome rather than a panic:
- the two types are built from different constructors, or the same constructor
applied to a different number of arguments (
Mismatch), or - binding a variable would make it refer to itself, producing an infinite type
(
Occurs).
Both variants carry the offending types, fully resolved under the substitution
at the point of failure, so the failure is actionable when it is rendered far
from the call that produced it — typically by mapping it onto a diag-lang
diagnostic with the consumer’s own type names.
The enum is #[non_exhaustive]: a downstream match must include a wildcard
arm, so a later addition is a minor change, not a breaking one.
§Examples
use type_lang::{TyCon, Type, TypeError, Unifier};
const INT: TyCon = TyCon::new(0);
const BOOL: TyCon = TyCon::new(1);
let mut unifier = Unifier::new();
let err = unifier
.unify(&Type::con(INT), &Type::con(BOOL))
.unwrap_err();
assert!(matches!(err, TypeError::Mismatch { .. }));Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
Mismatch
The two types do not share a constructor.
Returned when the heads differ (Int versus Bool) or when the same head
is applied to a different arity (Pair<A> versus Pair<A, B>). Both sides
are resolved under the current substitution before being stored, so they
show the most concrete form known at the point of failure.
unify(a, b) records a as expected and b as found. Unification
itself is symmetric — the labels only reflect the argument order, to match
the common “expected this, found that” phrasing of a type error.
Fields
Occurs
Binding a variable would make it occur within its own definition.
Returned when a variable would be bound to a type that already contains it —
for example unifying ?0 with List<?0>. Such a binding describes an
infinitely deep type, which the occurs check rejects so that resolution
always terminates.
Trait Implementations§
impl Eq for TypeError
Source§impl Error for TypeError
impl Error for TypeError
1.30.0 · Source§fn source(&self) -> Option<&(dyn Error + 'static)>
fn source(&self) -> Option<&(dyn Error + 'static)>
1.0.0 · Source§fn description(&self) -> &str
fn description(&self) -> &str
use the Display impl or to_string()