[Haskell-cafe] DSL for data definition (e.g. compiling Haskell type defs into Google's protocol buffers type defs)

Edward Z. Yang ezyang at MIT.EDU
Tue Oct 4 18:11:45 CEST 2011


Just making sure: have you looked at the Data.Data module yet?

Edward

Excerpts from Karel Gardas's message of Tue Oct 04 12:02:34 -0400 2011:
> 
> 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
> 



More information about the Haskell-Cafe mailing list