It doesn't <i>feel</i> very declarative in Rust. Personally, I'm finding it hard to see the intent (I haven't written a line of Rust in my life, so take that with a pinch of salt, but I am a polyglot programmer).<p>Really, Haskell's do notation is the big winner when it comes to parser combinators, as the direction of the flow of the parser is easy to follow, but also you can capture variables mid-flight for use later in the expression without obvious nested scope blocks.<p>It's possible to capture variables with `and_then` by the looks of it, but any suitably complex parser will start to end up quite an ugly mess of nested scopes.<p>I ported Haskell's Parsec to C# [1], it has LINQ which is similar to Haskell's Do notation. Simple parsers [2] are beautifully declarative, and even complex ones, like this floating point number parser [3], are trivial to follow.<p>[1] <a href="https://github.com/louthy/language-ext" rel="nofollow">https://github.com/louthy/language-ext</a><p>[2] <a href="https://github.com/louthy/language-ext/blob/master/LanguageExt.Parsec/Parsers/Prim.cs#L452" rel="nofollow">https://github.com/louthy/language-ext/blob/master/LanguageE...</a><p>[2] <a href="https://github.com/louthy/language-ext/blob/master/LanguageExt.Parsec/Parsers/Token.cs#L287" rel="nofollow">https://github.com/louthy/language-ext/blob/master/LanguageE...</a>