type P a nil :: a -> P a token :: (String->Maybe a) -> P a (!) :: P a -> P a -> P a (<@) :: P (a->b) -> P a -> P b parse :: P a -> [String] -> Either ErrorMessage a