[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