[][src]Macro monadic::monadic

macro_rules! monadic {
    (let $v:ident = $e:expr ; $($rest:tt)*) => { ... };
    (guard $pred:expr ; $($rest:tt)*) => { ... };
    (_ <- $monad:expr ; $($rest:tt)* ) => { ... };
    ($v:ident <- $monad:expr ; $($rest:tt)* ) => { ... };
    (&$v:ident <- $monad:expr ; $($rest:tt)* ) => { ... };
    ($monad:expr                            ) => { ... };
}

converting monadic blocs of IntoIterator's as monads à la Haskell

You can use:

  • Option::pure( return_expresion) to return an expression value
  • v <- monadic_expression to use the monad result
  • _ <- monadic_expression to ignore the monad result
  • let z = expression to combine monad results
  • guard boolean_expression to filter results

it uses into_iter().flat_map instead of the defined bind for wider applicability since the latter requires the Sized constraint

There are transitive implementation relations for some structures to be instances of IntoIterator:

Some structures e.g. Range implement a supertrait of Iterator, which in turn implements IntoIterator impl<I: Iterator> IntoIterator for I ∀ I:Iterator, as documented so bringing std::iter::Iterator into scope could be useful