[Haskell-beginners] How to parse hetero-list
Baa
aquagnu at gmail.com
Thu Nov 30 12:08:28 UTC 2017
Hello, All!
I have types A, B, C... They have instances of class Read, Show,
SomethingElse, ... I want to keep them as one collection. For example,
I can use such datatype for it:
data Tags = forall a. Read a => Tags [a]
Now I want to parse "some-string" into A or B or C or ... but without
to create type's sum of A|B|C|...! All those types have `Read` instance
but Haskell will not find what instance to use, right? How to parse
string with alternatives where each alternative returns `ReadP A` or
`ReadP B`, etc? My intuition is that I should make `x <|> y <|> z <|> ...`
where x,y,z - parses string into A, B, C, ... so they are
expressions like `readPrec :: ReadPrec A`, etc. But how to pass types
into such expression? I must to make expression folding (with `<|>`)
`readPrec::someType`, where `someType` is item of types list `{A, B, C, ...}`
May be it's possible to be done with HList-like types, like: HSet, HVect or
similar, but I don't know:
- how to iterate/fold over types
- I'm not sure that HSet/HVect keeps types (like `A ::: B ::: C ::: ...`)
My idea is to have some function which can parse string into one of A|B|C|...
with call like:
myParse "some-string" :: (Something A ::: B ::: C ::: D)
(suppose `:::` is type-level "cons"). So, `myParse` is polymorphic and
it can fold/iterate over type-list items (to call appropriate
`readPrec`).
Is it even possible?
In languages with reflection I can pass list of types (type - is usual
value) and call type's methods, but how to solve similar in Haskell?
===
Best regards, Paul
More information about the Beginners
mailing list