<br><br><div><span class="gmail_quote">On 6/25/07, <b class="gmail_sendername">Udo Stenzel</b> &lt;<a href="mailto:u.stenzel@web.de">u.stenzel@web.de</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
That type signature describes a function that can deliver *anything*<br>(that is in class Data), whatever you ask from it.</blockquote><div><br><br>Yes, that is the goal :-)<br>&nbsp;</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
If you do that, you wind up dragging in all the<br>machinery of Data.Generic </blockquote><div><br>Is reflection hard in Haskell?&nbsp; In C# its easy, and its one of the most powerful features of C# <br>&nbsp;</div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
just to implement what HaXml does with much<br>simpler technology.&nbsp;&nbsp;I doubt that&#39;s what you actually want.</blockquote><div><br>It is exactly what I want ;-)&nbsp; haxml needs a DTD.<br>&nbsp;</div>On the other hand, I might be misunderstanding.&nbsp;&nbsp;In that case,
<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Data.Generics should have everything you need, in particular gunfold and<br>friends.</blockquote>
<div><br>Yes, but I&#39;m kindof stuck giving useful input to makeConstrM, so if anyone has any ideas?<br>&nbsp;</div></div>kpreid in irc gave me an example of using makeConstrM for a pair of strings , but I cant seem to generalize it to work with a custom data type containing strings and ints ( eg Config{ login :: String, maxLogAgeDays :: Int } )
<br><br>Current (not working) code looks something like the following. Most of the working bits of testConstrM&#39; / runM&#39; come from kpreid, the rest is my feeble attempts to tweak it.<br><br>runM&#39; :: (MonadState [String] m, Monad m, Data a) =&gt; m a
<br>runM&#39; = do<br>&nbsp;&nbsp; value &lt;- gets head<br>&nbsp;&nbsp; modify tail<br>&nbsp;&nbsp; -- then one of: (pick the non-working function of your choice ;-)&nbsp; :<br>&nbsp;&nbsp; -- return read (fromJust value)<br>&nbsp;&nbsp; -- return (fromJust $ cast value )<br>
&nbsp;&nbsp; -- return (fst $ head $ gread( &quot;(&quot; ++ value ++ &quot;)&quot; ) )<br>&nbsp;&nbsp; -- return (fromConstrM runM&#39; constr)<br>&nbsp;&nbsp; -- return (fromConstr contr)<br><br>testConstrM&#39; :: (Read a, Data a, Read c, Read b, Data b, Data c) =&gt; [String] -&gt; a -&gt; (b,c)
<br>testConstrM&#39; fieldvalues object = evalState( fromConstrM runM&#39; (toConstr object) ) fieldvalues<br><br>data Config = Config{ name :: String, age :: Int }<br>&nbsp;&nbsp; deriving( Data, Show, Typeable, Ord, Eq, Read )<br>
createConfig = Config &quot;blah&quot; 3<br><br>test = testConstrM&#39; [&quot;qsdfqsdf&quot;, &quot;7&quot;] createConfig<br><br>(I&#39;ve left out the xml parsing bit, which you can find at: <a href="http://www.haskell.org/haskellwiki/HXT">
http://www.haskell.org/haskellwiki/HXT</a> section 9.1.1/9.1.2)<br><br>Maybe I should escalate the question to the <a href="mailto:haskell@haskell.org">haskell@haskell.org</a> group?<br><br>