You must explicitly quantify the type parameters in the top level function when you use this extension. This works:<div><div><br></div><div><div class="im"><div class="im">{-# LANGUAGE ScopedTypeVariables #-}</div><div class="im">
<br></div><div class="im">safeFromInteger :: <span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="color: rgb(204, 0, 0);">forall a . </span></span>(Num a, Integral a, Bounded a) =&gt; Integer -&gt; Maybe a<br>
</div><div class="im">safeFromInteger i =</div><div class="im">   if i &gt; (toInteger (maxBound :: a))</div><div class="im">     then Nothing</div><div class="im">     else Just (fromInteger i)</div><div><br></div></div>
<div class="gmail_quote">On Tue, Apr 7, 2009 at 11:42 PM, Kannan Goundan <span dir="ltr">&lt;<a href="mailto:kannan@cakoose.com">kannan@cakoose.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">Max Rabkin &lt;max.rabkin &lt;at&gt; <a href="http://gmail.com" target="_blank">gmail.com</a>&gt; writes:<br>
<br>
&gt; The problem with your code is that the type of maxBound is<br>
&gt; unspecified. You need (maxBound `asTypeOf` i), or enable<br>
&gt; ScopedTypeVariables and use (maxBound :: a) (I think).<br>
<br>
</div>I tried doing the (maxBound :: a) thing, but got another confusing error:<br>
<div class="im"><br>
  safeFromInteger :: (Num a, Integral a, Bounded a) =&gt; Integer -&gt; Maybe a<br>
  safeFromInteger i =<br>
</div>    if i &gt; (toInteger (maxBound :: a))<br>
<div class="im">      then Nothing<br>
      else Just (fromInteger i)<br>
<br>
</div># ghci -XScopedTypeVariables Test.hs<br>
<br>
  Test.hs:3:20:<br>
    Could not deduce (Bounded a1) from the context ()<br>
      arising from a use of `maxBound&#39; at TestIntegerBounds.hs:3:20-27<br>
    Possible fix:<br>
      add (Bounded a1) to the context of an expression type signature<br>
    In the first argument of `toInteger&#39;, namely `(maxBound :: a)&#39;<br>
    In the second argument of `(&gt;)&#39;, namely<br>
        `(toInteger (maxBound :: a))&#39;<br>
    In the expression: i &gt; (toInteger (maxBound :: a))<br>
<div><div></div><div class="h5"><br>
<br>
<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>
</div></div></blockquote></div><br></div></div>