data P res = Nil res | forall arg . Ap (P (arg->res)) (P arg) | P res :-- String | Token (String->Maybe res) String | P res :! P res | forall item . Many (res->[item]) ([item]->res) (P item) many :: P a -> P [a] many = Many id id
Many
express
the fact that the result type is expected to be isomorphic to
some list type.