I am writing URL parsing library which works the following way:
- User have a spec of URL, like this:
> f :: String
> f = "/archive/<int:number>
- There is data type and parser for specs:
> data Value = IntegerValue Integer | CharValue Char
> parseSpec :: Parser (Parser (Map String Value))
- So after parsing spec I have parser for URLs and after parsing them
â I have mapping from strings to Value values extracted from URL and
then I can process them.
Now, I want to others to extend my specs by providing additional
types, for example:
> spec :: String
> spec = "/archive/<year:archiveyear>
And store year in:
> data Year = Year Integer
But for that I need to extend Value data type too:
> data Value = Integer Value | CharValue Char | YearValue Year
Which is undesirable...
So, I decide to use type class instead of Value type:
> class Value a
> instance Value Integer
> instance Value Char
> instance Value Year
> parseSpec :: (Value a) => Parser (Parser (Map String a))
But after parsing URL I have mapping from string to some values of
type (Value a) => a which I can't process, but only by applying
functions from Value type class, which is limited.
So, is there any way to extract type information from containers like
(Value a) => Map String a? Something like this:
> getInteger :: (Value a) => Map String a -> Maybe Integer
Or maybe, am I doing something wrong from the beginning?
Haskell-Cafe mailing list