ExplicitMonadic

Struct ExplicitMonadic 

Source
pub struct ExplicitMonadic;
Expand description

Monadic Phase

This module defines a phase that makes the monadic encoding explicit by introducing calls to hax primitives (pure and lift) when necessary.

§Details

In backends with a monadic encoding (Lean for instance), rust computations that can crash are wrapped in an error Monad (say RustM): a function fn f(x:u32) -> u32 will be extracted to something like def f (x:u32) : RustM u32. There are two challenges in this encoding :

  1. Some expressions cannot panic (literals, consts, constructors for enums, etc) and should be wrapped in the monad1. This phase inserts explicit calls to pure to that aim.

  2. Language constructs (if-then-else, match, etc.) and rust functions still expect rust values as input, not monadic ones. This phase inserts explicit calls to lift to materialize the sub-expressions that return a monadic result where a value is expected. The Lean backend turns them into explicit lifts (← ..), which implicitly introduces a monadic bind

This phase expects all function and closure bodies to be monadic computations by default.


  1. While implicit coercions can sometime be enough, they can also badly interact with inference, typically when dealing with branches (like if-then-else) where some branches are pure and some are not. 

Trait Implementations§

Source§

impl Debug for ExplicitMonadic

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ExplicitMonadic

Source§

fn default() -> ExplicitMonadic

Returns the “default value” for a type. Read more
Source§

impl Phase for ExplicitMonadic

Source§

fn apply(&self, items: &mut Vec<Item>)

Apply the phase on items. A phase may transform an item into zero, one or more items.

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> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
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<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more