On Mon, Oct 6, 2008 at 8:07 PM, Christian Maeder <[EMAIL PROTECTED]> wrote: > 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. >
You are right. But that was not the problem. The problem was that I wrestled with Haskell's type system quite a bit to make freeParser work. What I want to write is freeParser :: (Enum a, Bounded a, Show a, Read a) => Parser a freeParser = liftM read $ choice (map (string . show) enumAll) but it doesn't compile. How can I make this piece code work? > 2. Calling read after parsing looks stupid. Just return the value shown > as parser result (within map). > Good point. It is silly =-) > 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"! > Sure. I actually use Parsec's reserved, which is kind enough to manage all this stuff for me. > 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! >> > -- Slavomir Kaslev _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe