<div dir="ltr"><font color="#003333"><font size="2"><font face="verdana,sans-serif">Correction. The last example should have been as follows. <br><br></font></font></font><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">When I tried the following in the file,<br>

<br></font><div style="margin-left: 40px;"><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">print (null&#39; ([] :: (Eq a) =&gt; [a]))</font><br>
</div><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2"><br>I got this error message on loading the file.</font><br><br><div style="margin-left: 40px; font-family: verdana,sans-serif; color: rgb(255, 0, 0);">

Null.hs:3:24:<br>    Ambiguous type variable `a&#39; in the constraint:<br>      `Eq a&#39; arising from an expression type signature at Null.hs:3:24-42<br>    Probable fix: add a type signature that fixes these type variable(s)<br clear="all">

</div><div dir="ltr"><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2"><br>-- Russ <br></font></div><br>
<br><br><div class="gmail_quote">On Sun, Sep 26, 2010 at 1:46 PM, Russ Abbott <span dir="ltr">&lt;<a href="mailto:russ.abbott@gmail.com">russ.abbott@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;">

<div dir="ltr"><font color="#003333"><font size="2"><font face="verdana,sans-serif">The following runs without a problem.<br><br></font></font></font><div style="margin-left: 40px;"><font color="#003333"><font size="2"><font face="verdana,sans-serif">Prelude&gt; let null&#39; xs = xs == []</font></font></font><br>


<font color="#003333"><font size="2"><font face="verdana,sans-serif">null&#39; :: (Eq a) =&gt; [a] -&gt; Bool</font></font></font><br><br><font color="#003333"><font size="2"><font face="verdana,sans-serif">Prelude&gt; let main&#39; = do print (null&#39; [])</font></font></font><br>


<font color="#003333"><font size="2"><font face="verdana,sans-serif">main&#39; :: IO ()</font></font></font><br><br><font color="#003333"><font size="2"><font face="verdana,sans-serif">Prelude&gt; main&#39;</font></font></font><br>


<font color="#003333"><font size="2"><font face="verdana,sans-serif">True</font></font></font><br><font color="#003333"><font size="2"><font face="verdana,sans-serif">it :: ()</font></font></font><br></div><font color="#003333"><font size="2"><font face="verdana,sans-serif"><br>


But if I put essentially the same code in a file and try to load the file I get an error.<br><br></font></font></font><div style="margin-left: 40px;"><font color="#003333"><font size="2"><font face="verdana,sans-serif">File:</font></font></font> Null<br>


<br></div><div style="margin-left: 40px;"><div style="margin-left: 40px;"><font color="#003333"><font size="2"><font face="verdana,sans-serif">null&#39; xs = xs == []</font></font></font><br><br><font color="#003333"><font size="2"><font face="verdana,sans-serif">main = do print (null&#39; [])</font></font></font><br>


</div></div><font color="#003333"><font size="2"><font face="verdana,sans-serif"><br></font></font></font><div><font color="#003333"><font size="2"><font face="verdana,sans-serif"><br></font></font></font><div style="margin-left: 40px;">


<font color="#003333"><font size="2"><font face="verdana,sans-serif">Prelude&gt; :load &quot;Null.hs&quot;</font></font></font><br><font color="#003333"><font size="2"><font face="verdana,sans-serif">[1 of 1] Compiling Main             ( Null.hs, interpreted )</font></font></font><br>


<br><font color="#003333"><font size="2"><font face="verdana,sans-serif">Null.hs:3:17:</font></font></font><br><font color="#003333"><font size="2"><font face="verdana,sans-serif">    Ambiguous type variable `a&#39; in the constraint:</font></font></font><br>


<font color="#003333"><font size="2"><font face="verdana,sans-serif">      `Eq a&#39; arising from a use of `null&#39;&#39; at Null.hs:3:17-24</font></font></font><br><font color="#003333"><font size="2"><font face="verdana,sans-serif">    Probable fix: add a type signature that fixes these type variable(s)</font></font></font><br>


<font color="#003333"><font size="2"><font face="verdana,sans-serif">Failed, modules loaded: none.</font></font></font><br></div><font color="#003333"><font size="2"><font face="verdana,sans-serif"><br clear="all"></font></font></font><div dir="ltr">


<font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">Why is that?<br><br><br>I had thought that the ambiguity was referring to the type of [] in the print statement, i.e., that GHC can&#39;t figure out the type of [].  If I modify the print statement to be   print ( null&#39; ([] :: [Int]) )  everything is ok.<br>


<br>But if that&#39;s the case, why is this not a problem at the interactive level?<br><br>Here is a related question.  In the following what does it mean to say that x is of type [a] where &quot;a&quot; is a type variable?<br>


<br></font><div style="margin-left: 40px;"><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">Prelude&gt; let x = []</font><br><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">x :: [a]</font><br>


</div><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2"><br>For example, <br><br></font><div style="margin-left: 40px;"><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">Prelude&gt; x == (tail [1 :: Int])</font><br>


<font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">True</font><br><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">it :: Bool</font><br><br><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">Prelude&gt; x == (tail [1 :: Float])</font><br>


<font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">True</font><br><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">it :: Bool</font><br><br><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">Prelude&gt; (tail [1 :: Int]) == (tail [1 :: Float])</font><br>


<br><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">&lt;interactive&gt;:1:28:</font><br><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">    Couldn&#39;t match expected type `Int&#39; against inferred type `Float&#39;</font><br>


<font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">    In the expression: 1 :: Float</font><br><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">    In the first argument of `tail&#39;, namely `[1 :: Float]&#39;</font><br>


<font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">    In the second argument of `(==)&#39;, namely `(tail [1 :: Float])&#39;</font><br></div><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2"><br>


Can a value like the value of x really be of an incompletely specified type?<br><br>I couldn&#39;t do that in the file.<br><br>When I tried the following in the file,<br><br></font><div style="margin-left: 40px;"><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">print (null&#39; ([] :: (Eq a) =&gt; a))</font><br>


</div><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2"><br>I got this error message on loading the file.<br><br></font><div style="margin-left: 40px;"><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">Null.hs:3:24:</font><br>


<font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">    Couldn&#39;t match expected type `a1&#39; against inferred type `[a]&#39;</font><br><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">      `a1&#39; is a rigid type variable bound by</font><br>


<font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">           an expression type signature at Null.hs:3:34</font><br><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">    In the first argument of `null&#39;&#39;, namely `([] :: (Eq a) =&gt; a)&#39;</font><br>


<font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">    In the first argument of `print&#39;, namely</font><br><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">        `(null&#39; ([] :: (Eq a) =&gt; a))&#39;</font><br>


<font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2">    In the expression: print (null&#39; ([] :: (Eq a) =&gt; a))</font><br></div><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2"><br>


<br>Thanks.<br><br>-- Russ</font><br>
</div><br></div></div>
</blockquote></div><br></div>