&gt; Then you&#39;d need a fundep on your class, which begins to get ugly<br><br>&gt; It also doesn&#39;t work when the two instances of name come from totally
separate libraries that don&#39;t know anything about each other (e.g.
one&#39;s an xml library, the other is a database library).<br>&gt; Then you have
to add such a class in your own code to resolve the conflict.  But
having read the wiki page,
it seems TDNR doesn&#39;t work in where I would particularly want it (e.g.
record updating), so I&#39;m not sure it&#39;s that worthwhile.<br><br>I agree with you in those cases.<br>But why would TDNR not work in the second case?<br><br><br><div class="gmail_quote">2010/11/10 Neil Brown <span dir="ltr">&lt;<a href="mailto:nccb2@kent.ac.uk">nccb2@kent.ac.uk</a>&gt;</span><br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">


  

<div text="#000000" bgcolor="#ffffff"><div class="im">
On 10/11/10 12:36, Yves Parès wrote:
<blockquote type="cite">I think this idea is a stairway to duck typing.<br>
I exagerate, of course, but here is my point:<br>
  <br>
It shouldn&#39;t be difficult to make a class:<br>
  <span style="font-family: courier new,monospace;">class HasName a
where</span><br style="font-family: courier new,monospace;">
  <span style="font-family: courier new,monospace;">  name :: a -&gt;
String</span><br>
</blockquote>
<br></div>
For accessing parts of data structures that have the same type, I agree
that a type-class is best.  However, this doesn&#39;t cover the situation
where the type of the field is different across types, e.g.<br>
<br>
data SomeXmlDerivedThingy = C { name :: Maybe String }<br>
data Person = P { name :: String }<br>
<br>
Then you&#39;d need a fundep on your class, which begins to get ugly:<br>
<br>
class HasName a b | a -&gt; b where<br>
  name :: a -&gt; b<br>
<br>
It also doesn&#39;t work when the two instances of name come from totally
separate libraries that don&#39;t know anything about each other (e.g.
one&#39;s an xml library, the other is a database library).  Then you have
to add such a class in your own code to resolve the conflict.  But
having read the wiki page,
it seems TDNR doesn&#39;t work in where I would particularly want it (e.g.
record updating), so I&#39;m not sure it&#39;s that worthwhile.<br>
<br>
As an aside, the rule on the wiki page says &quot;Unlike normal unqualified
variable
occurrences, it is legal for there to be many f&#39;s in scope. To resolve
which one is intended, find the type of a, and the type of all of the
in-scope f&#39;s. If there is exactly one f whose type matches that of a,
that resolve the occurrence of f. Otherwise the program is in error. &quot;<br>
<br>
I wonder if special syntax is actually needed for this.  How much of
the language would be broken by adopting the general rule: &quot;If the only
definitions of f are at the top-level or imported, find the type of &#39;a&#39;
and the type of all the in-scope &#39;f&#39; s.  If there is exactly one match
then use it, otherwise it&#39;s an error.&quot;?  <br>
<br>
Thanks,<br>
<br>
Neil.<br>
<br>
</div>

<br>_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
<br></blockquote></div><br>