Skip to main content

UnificationTable

Struct UnificationTable 

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§

§

impl UnificationTable

pub fn new() -> UnificationTable

pub fn fresh(&mut self) -> InferType

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

pub fn fresh_var(&mut self) -> TyVar

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

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.

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

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

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.

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.

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

Zonk then convert to LogosType. Unsolved variables become Unknown.

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
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
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> Same for T

Source§

type Output = T

Should always be Self
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.
§

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

§

fn vzip(self) -> V

§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,