<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sun, Apr 12, 2015 at 12:41 PM, Christian Sperandio <span dir="ltr"><<a href="mailto:christian.sperandio@gmail.com" target="_blank">christian.sperandio@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word"><div>I’m currently playing with the mutable array to implement an heap sort sort (from The Art of Computer Programming) and I’m puzzled with an error.</div><div><br></div><div>When I code:</div><div><br></div><div><div><font face="Courier New">toHeap :: Ord a => [a] -> IO [a]</font></div><div><font face="Courier New">toHeap [] = return []</font></div><div><font face="Courier New">toHeap [x] = return [x]</font></div><div><font face="Courier New">toHeap xs = do</font></div><div><font face="Courier New">  arr <- newListArray (1, length xs) xs :: IO (IOArray Int a)</font></div><div><font face="Courier New">  getElems arr</font></div></div></div></blockquote><div><br></div><div>Note that the "a" in the signature "IO (IOArray Int a)" is *not* the same as the one in the signature of toHeap; the scope of that type variable is the signature itself, not the following equation(s). You have in effect done the opposite of what you intended --- instead of asserting it is the same, you asserted that it is a *different* one, by handing the compiler an unexpected `a` which must be assumed to represent a distinct type.</div><div><br></div><div>If you need to extend the scope of a type variable like this, you need the ScopedTypeVariables extension, and to declare the type variable as having extended scope with an explicit `forall`:</div><div><br></div><div><div><span style="font-family:'Courier New'">{-# LANGUAGE ScopedTypeVariables #-}</span></div><div><span style="font-family:'Courier New'"><br></span></div><div><span style="font-family:'Courier New'">toHeap :: forall a. Ord a => [a] -> IO [a]</span><br></div><div><font face="Courier New">toHeap [] = return []</font></div><div><font face="Courier New">toHeap [x] = return [x]</font></div><div><font face="Courier New">toHeap xs = do</font></div><div><font face="Courier New">  arr <- newListArray (1, length xs) xs :: IO (IOArray Int a)</font></div><div><font face="Courier New">  getElems arr</font></div></div><div><br></div></div>-- <br><div class="gmail_signature"><div dir="ltr"><div>brandon s allbery kf8nh                               sine nomine associates</div><div><a href="mailto:allbery.b@gmail.com" target="_blank">allbery.b@gmail.com</a>                                  <a href="mailto:ballbery@sinenomine.net" target="_blank">ballbery@sinenomine.net</a></div><div>unix, openafs, kerberos, infrastructure, xmonad        <a href="http://sinenomine.net" target="_blank">http://sinenomine.net</a></div></div></div>
</div></div>