Hi Karel,<br><br>You can use SYB&#39;s toConstr/dataTypeOf [1] to obtain 
information about the name of the constructor and datatype. 
Alternatively, you can also use the new generic programming framework of
 ghc-7.2 [2].<br>
<br><br>Cheers,<br>Pedro<br><br>[1] <a href="http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Data.html#v:toConstr" target="_blank">http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Data.html#v:toConstr</a><br>



[2] <a href="http://haskell.org/ghc/docs/latest/html/libraries/ghc-prim-0.2.0.0/GHC-Generics.html#t:Datatype" target="_blank">http://haskell.org/ghc/docs/latest/html/libraries/ghc-prim-0.2.0.0/GHC-Generics.html#t:Datatype</a><br>


<br><div class="gmail_quote">On Tue, Oct 4, 2011 at 17:02, Karel Gardas <span dir="ltr">&lt;<a href="mailto:karel.gardas@centrum.cz" target="_blank">karel.gardas@centrum.cz</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<br>
Hello,<br>
<br>
I&#39;m trying to find out if it&#39;s possible to use Haskell data type definition capability to define types and compile defined types into other languages, for example into Google&#39;s protocol buffers data definition language. So basically speaking I&#39;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:<br>



<br>
data Person = Person {<br>
        id :: Int<br>
        , name :: String<br>
        , email :: Maybe String<br>
        }<br>
        deriving (Show, Data, Typeable)<br>
<br>
emit_proto Person 1<br>
<br>
where emit_proto is function which will translate Person data type definition into Google&#39;s proto language (the 1 is index from which start to index type&#39;s fields) by traversing data type definition and translating all its children plus do some header/footer generation etc:<br>



<br>
message Person {<br>
  required int32 id = 1;<br>
  required string name = 2;<br>
  optional string email = 3;<br>
}<br>
<br>
I&#39;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&#39;ve tried to look into Data.Typetable etc, but have not found function which will print data type&#39;s field name and field type name (although JSON lib seems to use field name for JSON generation so I&#39;ll need to investigate this more). I&#39;ve tested `typeOf&#39; function and it&#39;s quite useful, but its limitation is that it&#39;s not working on ADT name:<br>



<br>
data Color = RED|GREEN|BLUE<br>
<br>
*Main&gt; typeOf Color<br>
<br>
&lt;interactive&gt;:1:8: Not in scope: data constructor `Color&#39;<br>
<br>
*Main&gt; typeOf RED<br>
Main.Color<br>
<br>
and I would need that in order to translate Color defined above into enum like:<br>
<br>
enum Color {<br>
  RED = 0;<br>
  GREEN = 1;<br>
  BLUE = 2;<br>
}<br>
<br>
<br>
My question is: do you think I&#39;m looking into good direction (i.e. Data/Typeable) or do you think I&#39;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?)<br>



<br>
Thanks for any idea or opinion on this!<br>
Karel<br>
<br>
______________________________<u></u>_________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/<u></u>mailman/listinfo/haskell-cafe</a><br>
</blockquote></div><br>