[Haskell-cafe] Re: I want my free (and good looking) parser!

Slavomir Kaslev slavomir.kaslev at gmail.com
Mon Oct 6 13:20:57 EDT 2008

On Mon, Oct 6, 2008 at 8:07 PM, Christian Maeder
<Christian.Maeder at dfki.de> 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

More information about the Haskell-Cafe mailing list