
Forgotten note: GHC's Generics as described here: http://haskell.org/ghc/docs/latest/html/libraries/ghc-prim-0.2.0.0/GHC-Gener... -- is not yet clear to me, I'm searching for more information about this in the meantime... Karel On 10/ 4/11 08:33 PM, Karel Gardas wrote:
Hello,
thanks a lot to Edward, Jose, Ryan and Stephen for fast reply in this thread. I see I've not been that precise in specification of what I need exactly so I need to add this: I've changed a little bit definition of person to:
data PersonType = Person { id :: Int , name :: String , email :: Maybe String } deriving (Show, Data, Typeable)
so I have `PersonType' as type constructor and Person as value constructor (or data constructor) -- speaking using terms from Real World Haskell, Chapter 3[1]. And now I see that none of typeOf/dataTypeOf/toContr is applicable to *type constructor* but all are applicable to *value/data constructor*. Ditto happen when testing Color versus RED, GREEN, BLUE. At least GHCi complains this way:
*Main> typeOf Color
<interactive>:0:8: Not in scope: data constructor `Color' *Main> typeOf PersonType
<interactive>:0:8: Not in scope: data constructor `PersonType'
But, I'd like to start processing of data definition from the *type constructor*. So:
emit_proto PersonType 1 emit_proto Color 1
Is that possible at all? I mean in the scope/context of GHC's Data/Data.Data/Data.Typeable etc. modules. (w/o considering TH now).
Thanks! Karel
[1]: http://book.realworldhaskell.org/read/defining-types-streamlining-functions....
On 10/ 4/11 06:02 PM, Karel Gardas wrote:
Hello,
I'm trying to find out if it's possible to use Haskell data type definition capability to define types and compile defined types into other languages, for example into Google's protocol buffers data definition language. So basically speaking I'm thinking about using Haskell sub-set as a data-definition DSL together with some functions which will generate some code based on supplied defined data types. My idea is:
data Person = Person { id :: Int , name :: String , email :: Maybe String } deriving (Show, Data, Typeable)
emit_proto Person 1
where emit_proto is function which will translate Person data type definition into Google's proto language (the 1 is index from which start to index type's fields) by traversing data type definition and translating all its children plus do some header/footer generation etc:
message Person { required int32 id = 1; required string name = 2; optional string email = 3; }
I've looked for something like that and found SYB papers which works on top of data instance (i.e. actual data, not data type). I also found JSON lib which again works on top of data and not data type. I've tried to look into Data.Typetable etc, but have not found function which will print data type's field name and field type name (although JSON lib seems to use field name for JSON generation so I'll need to investigate this more). I've tested `typeOf' function and it's quite useful, but its limitation is that it's not working on ADT name:
data Color = RED|GREEN|BLUE
*Main> typeOf Color
<interactive>:1:8: Not in scope: data constructor `Color'
*Main> typeOf RED Main.Color
and I would need that in order to translate Color defined above into enum like:
enum Color { RED = 0; GREEN = 1; BLUE = 2; }
My question is: do you think I'm looking into good direction (i.e. Data/Typeable) or do you think I'll need to use something different for data definition DSL (Template Haskell?, or impossible in Haskell so write my own language with full parser? etc?)
Thanks for any idea or opinion on this! Karel
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe