This is what I have in my library. I use it every now and then, when I need sth with a name. Of course you still have to implement the name function for that data type, but I&#39;ve no better way of doing it.<br><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">class Show a =&gt; HasName a where</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    -- | accessor method for name</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    name :: a -&gt; String</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    -- | a method the update the stored name</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    updateName :: String -&gt; a -&gt; a</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    -- | show functions (for this type-class) are assumed to be shown *without* the name</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    -- | if you want to show with the name, you must use this function instead of show</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    -- | default implementation should be almost always sufficient.</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    showWithName :: a -&gt; String</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    -- | prints instead of just showing.</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    -- | default implementation should be almost always sufficient.</span><span style="font-family: courier new,monospace;"></span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    printWithName :: a -&gt; IO()</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    </span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    -- | if &quot;name&quot; is not implemented, just return a notice</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    name x = &quot;don&#39;t know my name: &quot; ++ show x</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    -- | if &quot;updateName&quot; is not implemented, there is nothing to do but giving an error </span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    updateName n x = error (&quot;updateName(&quot; ++ n ++ &quot;) not implemented: &quot; ++ show x)</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    showWithName p = name p ++ &quot;: &quot; ++ show p</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    printWithName = putStrLn . showWithName</span><br style="font-family: courier new,monospace;">
<br><br>Hope it helps,<br><br><br><br><div class="gmail_quote">On 20 March 2010 10:09, Stephen Tetley <span dir="ltr">&lt;<a href="mailto:stephen.tetley@gmail.com">stephen.tetley@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Hi John<br>
<br>
I can&#39;t see there is a way of getting the name of a variable.<br>
<br>
A Haskell compiler like GHC is fairly free to do what it likes with<br>
/values/, so a variable doesn&#39;t necessarily exist in a tangible form<br>
in a program - i.e. it might get compiled away due to constant<br>
folding[*]:<br>
<br>
main = let x = 5 in<br>
  do { print (10 * x) }<br>
<br>
... would likely become:<br>
<br>
main = do { print (10 * 5) }   -- by constant folding<br>
<br>
... and finally<br>
<br>
main = do { print 50 }     -- by static expression elimination<br>
<br>
--<br>
<br>
Values not /variables/ - are more tangible. Provided the type of the<br>
value is an instance of the type class Data, you can get at least the<br>
value&#39;s type name and its constructor name.<br>
<br>
To get something like named variable you would have to make a data<br>
type with two fields one for a name label and one for the value, e.g.<br>
:<br>
<br>
data Named a = Named String a<br>
  deriving (Show)<br>
<br>
valName :: Named a -&gt; String<br>
valName (Name s _) = s<br>
<br>
valValue :: Named a -&gt; a<br>
valValue (Name _ a) = a<br>
<br>
<br>
When you use a variable you want associated with a name, you will have<br>
to be a bit pedantic about always supplying the same name to construct<br>
it:<br>
<br>
e.g.: if you have a constant called scale_factor<br>
<br>
scale_factor :: Named Int<br>
scale_factor = Named &quot;scale_factor&quot; 10<br>
<br>
[At an advanced level you could probably use Template Haskell to make<br>
this easier]<br>
<br>
--<br>
<br>
Your program would then be something like :<br>
<br>
writeFileFor :: Named a -&gt; IO ()<br>
writeFileFor v =<br>
 do<br>
    let nameOfV = valName v<br>
<div class="im">    outh &lt;- openFile (nameOfV ++ &quot;.txt&quot;) WriteMode<br>
<br>
</div>    let outputstring = calculationsFrom (varValue v)<br>
<div class="im"><br>
    hPutStr outh outputstring<br>
<br>
    hClose outh<br>
<br>
<br>
</div>Though it would more succinct to use pattern matching:<br>
<br>
<br>
writeFileFor :: Named a -&gt; IO ()<br>
writeFileFor (Named name value) =<br>
 do<br>
    outh &lt;- openFile (name ++ &quot;.txt&quot;) WriteMode<br>
<br>
    let outputstring = calculationsFrom value<br>
<div class="im"><br>
    hPutStr outh outputstring<br>
<br>
    hClose outh<br>
<br>
<br>
<br>
</div>As a side issue - having access to variables rather than values seems<br>
an usually prospect for any programming language. I&#39;d guess that it<br>
would effectively prevent the language being compiled or the language<br>
would would have to limit reflective / introspective access only to<br>
global variables.<br>
<br>
Best wishes<br>
<br>
Stephen<br>
<br>
<br>
<br>
[*] Actually for important reasons GHC does not do that much constant<br>
folding - but it is possibly the easiest optimization to use as an<br>
illustration here.<br>
<div><div></div><div class="h5">_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/beginners" target="_blank">http://www.haskell.org/mailman/listinfo/beginners</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>Ozgur Akgun<br>