Thanks. I realize there are many ways to make it compile. <br>However, I am trying to understand the mechanism behind -- <br>why does the first example compile and what constraints does <br>enumerateMethodNames add on a (which it does not inspect)?<br>
<br><br>cheers,<br><br>Marcus<br><br><div class="gmail_quote">2010/3/4 Rahul Kapoor <span dir="ltr">&lt;<a href="mailto:rk@trie.org">rk@trie.org</a>&gt;</span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="im">&gt; methods :: (Eq a) =&gt; [(String, a)]<br>
&gt; methods =<br>
&gt;   [ (&quot;method1&quot;, undefined )<br>
&gt;   , (&quot;method2&quot;, undefined)<br>
&gt;   ]<br>
&gt;<br>
&gt; enumerateMethodNames :: [String]<br>
&gt; enumerateMethodNames = map fst methods<br>
<br>
</div>The above does not compile because the source does not have<br>
enough information for GHC to determine what actual types to use<br>
for &quot;methods&quot; since undefined can stand in as values for any<br>
type. The program will compile if you use actual values instead<br>
of undefined or supply an explicit type signature.<br>
<br>
for example:<br>
<br>
enumerateMethodNames = map fst (methods :: [(String, String)])<br>
or<br>
methods :: [(String, SomeEqType)]<br>
<font color="#888888"><br>
<br>
Rahul<br>
</font></blockquote></div><br>