A macro to write Haskell style monadic code
for IntoIterator (iterables) as monads
Each step monad expression is flat_mapped with the rest into a lazy FlatMap expression which implements IntoIterator with lambdas as move closures capturing the environment and argument.
You can use:
* Some( 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
Note: let, within the macro, introduces an expression, not a block.
Example: monadic comprehensions à la Haskell
``` // examples/comprehension.rs
use monadic::monadic; use num::Integer;
fn main() { let xs = monadic!{
x <- 1..7;
y <- 1..x;
guard (&y).is_odd() ;
let z = &y + 1 ;
Some((x, z))
}.collect::<Vec<(i32,i32)>>();
println!("result: {:?}", xs);
}
bash
$ cargo run --example comprehension
result: [(2, 2), (3, 2), (4, 2), (4, 4), (5, 2), (5, 4), (6, 2), (6, 4), (6, 6)] ```