People keep wanting monadic syntax (I'm one of them), but I believe the general suggestion is to do it via macros/syntax extensions. E.g. write something that desugars
do! {
bind x = foo();
let bar = baz(10);
ret x + bar
}
into the equivalent of Haskell's
do
x <- foo
let bar = baz 10
return $ x + bar
Rust currently lacks higher-kinded types, so it would be hard to write functions that are generic over monads but the above would at least give some local reprieve.
Also, note the `if_ok!` macro alluded to in the point about IO errors is giving the shortcircuiting behaviour of the Either monad (specific to Either, though).
(NB. the macro probably can't be called `do` just yet, but we may remove that as a keyword. Maybe.)