public void TestFlatten() { ParserMonad <ParserMonad <int> > p = text => { var first = text[0]; if (first == 'a') { return(Tuple.Create <ParserMonad <int>, string>( rest => Tuple.Create(int.Parse(rest.Substring(0, 5)), rest.Substring(5)), text.Substring(1))); } return(Tuple.Create(ParserMonad.Wrap(-1), text.Substring(1))); }; var q = p.Flatten(); q("a00004x").AssertEquals(Tuple.Create(4, "x")); q("b00004x").AssertEquals(Tuple.Create(-1, "00004x")); }