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

Karel Gardas karel.gardas at centrum.cz
Tue Oct 4 20:37:39 CEST 2011


Forgotten note: GHC's Generics as described here: 
http://haskell.org/ghc/docs/latest/html/libraries/ghc-prim-0.2.0.0/GHC-Generics.html#t:Datatype 
-- 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.html
>
>
>
>
> 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 at haskell.org
>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>
>




More information about the Haskell-Cafe mailing list