Enum polytype::TypeSchema[][src]

pub enum TypeSchema<N: Name = &'static str> {
    Monotype(Type<N>),
    Polytype {
        variable: Variable,
        body: Box<TypeSchema<N>>,
    },
}

Represents polytypes (uninstantiated, universally quantified types).

The primary ways of creating a TypeSchema are with the ptp! macro or with Type::generalize.

Variants

Non-polymorphic types (e.g. α → β, int → bool)

Polymorphic types (e.g. ∀α. α → α, ∀α. ∀β. α → β)

Fields of Polytype

The Variable being bound

The type in which variable is bound

Methods

impl<N: Name> TypeSchema<N>
[src]

Checks whether a variable is bound in the quantification of a polytype.

Examples

let t = ptp!(0; @arrow[tp!(0), tp!(1)]); // ∀α. α → β
assert!(t.is_bound(0));
assert!(!t.is_bound(1));

Returns a set of each Variable bound by the TypeSchema.

Examples

let t = ptp!(0, 1; @arrow[tp!(1), tp!(2), tp!(3)]); // ∀α. ∀β. β → ɣ → δ
assert_eq!(t.bound_vars(), vec![0, 1]);

Returns a set of each free Variable in the TypeSchema.

Examples

let t = ptp!(0, 1; @arrow[tp!(1), tp!(2), tp!(3)]); // ∀α. ∀β. β → ɣ → δ
let mut free = t.free_vars();
free.sort();
assert_eq!(free, vec![2, 3]);

Instantiate a TypeSchema in the context by removing quantifiers.

All type variables will be replaced with fresh type variables.

Examples

let mut ctx = Context::default();

let t1 = ptp!(3; list(tp!(3)));
let t2 = ptp!(3; list(tp!(3)));

let t1 = t1.instantiate(&mut ctx);
let t2 = t2.instantiate(&mut ctx);
assert_eq!(t1.to_string(), "list(t0)");
assert_eq!(t2.to_string(), "list(t1)");

Like instantiate, but works in-place.

Parse a TypeSchema from a string. This round-trips with Display. This is a leaky operation and should be avoided wherever possible: names of constructed types will remain until program termination.

The "for-all" is optional.

Examples

let t_par = TypeSchema::parse("∀t0. t0 -> t0").expect("valid type");
let t_lit = ptp!(0; @arrow[tp!(0), tp!(0)]);
assert_eq!(t_par, t_lit);

let s = "∀t0. ∀t1. (t1 → t0 → t1) → t1 → list(t0) → t1";
let t: TypeSchema<&'static str> = TypeSchema::parse(s).expect("valid type");
let round_trip = t.to_string();
assert_eq!(s, round_trip);

Trait Implementations

impl<N: Debug + Name> Debug for TypeSchema<N>
[src]

Formats the value using the given formatter. Read more

impl<N: Clone + Name> Clone for TypeSchema<N>
[src]

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

impl<N: Hash + Name> Hash for TypeSchema<N>
[src]

Feeds this value into the given [Hasher]. Read more

Feeds a slice of this type into the given [Hasher]. Read more

impl<N: PartialEq + Name> PartialEq for TypeSchema<N>
[src]

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

impl<N: Eq + Name> Eq for TypeSchema<N>
[src]

impl<N: Name> Display for TypeSchema<N>
[src]

Formats the value using the given formatter. Read more

Auto Trait Implementations

impl<N> Send for TypeSchema<N> where
    N: Send

impl<N> Sync for TypeSchema<N> where
    N: Sync