[Haskell-cafe] Parsec and type level numerals

Nathan Bloomfield nbloomf at gmail.com
Sat Dec 13 14:13:01 EST 2008


Hello all. I've got a puzzling Parsec problem. Perhaps the collective wisdom
of haskell-cafe can point me in the right direction.

I want to be able to parse a string of digits to a type level numeral as
described in the Number parameterized
types<http://okmij.org/ftp/papers/number-parameterized-types.pdf>paper.
After fiddling with the problem for a while, I'm not convinced it's
possible- it seems as though one would need to know the type of the result
before parsing, but then we wouldn't need to parse in the first place. :) My
first (simplified) approximation is as follows:

> data Zero = Zero
> data Succ a = Succ a

> class Card t
> instance Card Zero
> instance (Card a) => Card (Succ a)

> parseP :: (Card a) => Parser a
> parseP = do { char '1'
>             ; rest <- parseP
>             ; return $ Succ rest
>             }
>          <|> return Zero

I'd like for this to parse, for example, "111" into Succ Succ Succ Zero. Of
course this doesn't work because parseP is ill-typed, but I'm not sure how
to fix it. It seems that what I'm asking for is a function whose type is forall
a. (Card a) => String -> a, which is problematic.

Has anyone tried this before? I'm new to using Parsec and to parsing in
general, so I apologize if this is a silly question. (Parsec is very
impressive, by the way.)

Thanks-

Nathan Bloomfield
University of Arkansas, Fayetteville
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20081213/58e3b9e8/attachment.htm


More information about the Haskell-Cafe mailing list