<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' ([] :: (Eq a) => [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' in the constraint:<br> `Eq a' 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"><<a href="mailto:russ.abbott@gmail.com">russ.abbott@gmail.com</a>></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> let null' xs = xs == []</font></font></font><br>
<font color="#003333"><font size="2"><font face="verdana,sans-serif">null' :: (Eq a) => [a] -> Bool</font></font></font><br><br><font color="#003333"><font size="2"><font face="verdana,sans-serif">Prelude> let main' = do print (null' [])</font></font></font><br>
<font color="#003333"><font size="2"><font face="verdana,sans-serif">main' :: IO ()</font></font></font><br><br><font color="#003333"><font size="2"><font face="verdana,sans-serif">Prelude> main'</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' xs = xs == []</font></font></font><br><br><font color="#003333"><font size="2"><font face="verdana,sans-serif">main = do print (null' [])</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> :load "Null.hs"</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' in the constraint:</font></font></font><br>
<font color="#003333"><font size="2"><font face="verdana,sans-serif"> `Eq a' arising from a use of `null'' 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't figure out the type of []. If I modify the print statement to be print ( null' ([] :: [Int]) ) everything is ok.<br>
<br>But if that'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 "a" 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> 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> 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> 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> (tail [1 :: Int]) == (tail [1 :: Float])</font><br>
<br><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2"><interactive>:1:28:</font><br><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2"> Couldn't match expected type `Int' against inferred type `Float'</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', namely `[1 :: Float]'</font><br>
<font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2"> In the second argument of `(==)', namely `(tail [1 :: Float])'</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'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' ([] :: (Eq a) => 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't match expected type `a1' against inferred type `[a]'</font><br><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2"> `a1' 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'', namely `([] :: (Eq a) => a)'</font><br>
<font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2"> In the first argument of `print', namely</font><br><font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2"> `(null' ([] :: (Eq a) => a))'</font><br>
<font style="color: rgb(0, 51, 51); font-family: verdana,sans-serif;" size="2"> In the expression: print (null' ([] :: (Eq a) => 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>