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 :
-
Some expressions cannot panic (literals, consts, constructors for enums, etc) and should be wrapped in the monad1. This phase inserts explicit calls to
pureto that aim. -
Language constructs (if-then-else,
match, etc.) and rust functions still expect rust values as input, not monadic ones. This phase inserts explicit calls toliftto 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.
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
impl Debug for ExplicitMonadic
Source§impl Default for ExplicitMonadic
impl Default for ExplicitMonadic
Source§fn default() -> ExplicitMonadic
fn default() -> ExplicitMonadic
Auto Trait Implementations§
impl Freeze for ExplicitMonadic
impl RefUnwindSafe for ExplicitMonadic
impl Send for ExplicitMonadic
impl Sync for ExplicitMonadic
impl Unpin for ExplicitMonadic
impl UnwindSafe for ExplicitMonadic
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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