Implementation of our command line parsing combinators
To be able to extract the grammar, implement all combinators as
constructors in a data type!
data P a where
Nil :: a -> P a
Ap :: P (b->a) -> P b -> P a
Token :: (String->Maybe a) -> String -> P a
(:--) :: P a -> String -> P a
(:!) :: P a -> P a -> P a
Many :: P a -> P [a]
...