Parser.variant : ∀(A: *) ∀(variants: (List (Parser.Guard A))) (Parser A) = λA λvariants use P = λx (Parser A) use cons = λvariant λothers (Pair.get (Parser Bool) (Parser A) variant (Parser A) λguard λparser (Parser.bind Bool A guard λsuccess (Bool.if success (Parser A) parser (Parser.variant A others) ) ) ) use nil = (Parser.fail A "error") (~variants P cons nil)