First run Parser p, if it succeeds, thread the return value to ToParser
yes; if it fails and no input is consumed, run Parser no; fails if p fails
and some input is consumed.
The created Parser object will first run parser p, if the return value of
parser p does not satisify the given predicate, it fails and the input
consumption of parser p is undone.
The created Parser object will first run parser p, if the return value of
parser p does not satisify the given predicate, it fails and the input
consumption of parser p is undone.