
Slavomir Kaslev wrote:
freeParser = freeParser' minBound where enumAll' :: (Bounded a, Enum a) => a -> [a] enumAll' _ = enumAll freeParser' :: (Enum a, Bounded a, Show a, Read a) => a -> Parser a freeParser' x = liftM read $ choice (map (string . show) (enumAll' x))
1. I would use an explicit function argument instead of "Show" to allow strings starting with lower case. 2. Calling read after parsing looks stupid. Just return the value shown as parser result (within map). 3. Instead of the "string" parser, it should be checked if a further alphaNum or '_' follows (for the longest match). And don't forget "try"! Cheers Christian
[Actually, in my code I use reserved' (reserved' x = reserved x >> return x) instead of string, where reserved is from Parsec's builtin tokenizer (which does some neat things behind the curtains). Here string is used just to illustrate the expamle.]
The problem is that freeParser, although useful, is far from elegant. It's something that I came up with by trial and error. In short: it's a hack.
I would like to hear your suggestions about how it can be beautified.
Thank you in advance.
Cheers!