Skip to main content

UnificationTable

Struct UnificationTable 

Source
pub struct UnificationTable { /* private fields */ }
Expand description

Union-Find table implementing Robinson unification with occurs check.

Type variables are allocated by [fresh] and resolved by [find]. [zonk] fully resolves a type after inference, converting remaining unbound variables to InferType::Unknown (which maps to LogosType::Unknown).

Implementations§

Source§

impl UnificationTable

Source

pub fn new() -> UnificationTable

Source

pub fn fresh(&mut self) -> InferType

Allocate a fresh unbound type variable, returning the wrapped InferType.

Source

pub fn fresh_var(&mut self) -> TyVar

Allocate a fresh unbound type variable, returning the raw TyVar.

Source

pub fn instantiate(&mut self, scheme: &TypeScheme) -> InferType

Instantiate a TypeScheme by replacing each quantified variable with a fresh one.

Each call site of a generic function gets independent fresh variables so that two calls to identity(42) and identity(true) do not interfere.

Source

pub fn find(&self, tv: TyVar) -> InferType

Follow the binding chain for a type variable (iterative, no path compression).

Source

pub fn resolve(&self, ty: &InferType) -> InferType

Resolve type variables, keeping unbound variables as Var(tv).

Unlike [zonk], this does not convert unbound variables to Unknown. Use this during inference to preserve generic type params as Var(tv) so they can be unified at call sites.

Source

pub fn zonk(&self, ty: &InferType) -> InferType

Fully resolve all type variables in a type.

Unbound variables become InferType::Unknown, which maps to LogosType::Unknown when converted by [to_logos_type].

Source

pub fn to_logos_type(&self, ty: &InferType) -> LogosType

Zonk then convert to LogosType. Unsolved variables become Unknown.

Source

pub fn unify(&mut self, a: &InferType, b: &InferType) -> Result<(), TypeError>

Unify two types, binding type variables as needed.

Returns Ok(()) if unification succeeds (bindings may be updated). Returns Err(TypeError) on a genuine type contradiction.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V