I always forget to reply all.  Silly gmail.<br><br><div class="gmail_quote">On Mon, Jun 6, 2011 at 2:07 AM, Ryan Ingram <span dir="ltr">&lt;<a href="mailto:ryani.spam@gmail.com">ryani.spam@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Hi Pat.  There aren&#39;t any casts in that code.  There are type annotations, but this is different than the idea of a cast like in C.<br>
<br>For example<br>    ((3 :: Integer) :: Int)<br>is a compile error.<br><br>What you are seeing is that 3 has the type (forall a. Num a =&gt; a); that is, the literal &#39;3&#39; gets converted by the compiler into<br>
<br>fromInteger (I# 3#)<br><br>where 3# represents the machine word &#39;3&#39; and I# is the internal constructor Word# -&gt; Integer.<br><br>class Num a where<br>    ...<br>    fromInteger :: Integer -&gt; a<br><br>So by &#39;casting&#39;, or rather, providing a type annotation, you are specifying what instance of Num gets the call to &#39;fromInteger&#39;.<br>

<br>As to whether you *need* a type annotation: it depends.  For example:<br>    foo () = sameId newId 3<br>the compiler will infer the type of &#39;foo&#39; to be<br>    foo :: forall a. IDs a =&gt; () -&gt; a<br><br>If you declare foo as a value, though, you run into the dreaded monomorphism restriction, and you might get a complaint from the compiler about ambiguity.<br>

    foo2 = sameId newId 3<br><br><br>The monomorphism restriction forces values to be values; otherwise consider this<br><br><br>-- the usual &#39;expensive&#39; computation<br>fib :: Num a =&gt; a -&gt; a<br>fib 0 = 1<br>

fib n = fib (n-1) + fib (n-2)<br><br>x = fib 100000<br><br>What&#39;s the type of x?  Most generally, it&#39;s<br>    x :: Num a =&gt; a<br><br>But this means that x will be recalculated every time it&#39;s used; the value can&#39;t be saved since x doesn&#39;t represent a single value but rather a separate value for each instance of Num.  You are allowed to manually specify this type, but without it, the compiler says &#39;You meant this to be a value!&#39; and forces it to a particular type if it can, or complains about ambiguity if it can&#39;t.  As to how it does so, look up the rules for defaulting and monomorphism in the Haskell report.<br>
<font color="#888888">
<br>  -- ryan</font><div><div></div><div class="h5"><br><br><br><div class="gmail_quote">On Mon, Jun 6, 2011 at 12:45 AM, Patrick Browne <span dir="ltr">&lt;<a href="mailto:patrick.browne@dit.ie" target="_blank">patrick.browne@dit.ie</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Are casts required to run the code below?<br>
If so why?<br>
Thanks,<br>
Pat<br>
<br>
<br>
-- Idetifiers for objects<br>
class (Integral i) =&gt; IDs i where<br>
 startId :: i<br>
 newId :: i -&gt; i<br>
 newId i = succ i<br>
 sameId, notSameId :: i -&gt; i -&gt; Bool<br>
-- Assertion is not easily expressible in Haskell<br>
-- notSameId i newId i  = True<br>
 sameId i j = i == j<br>
 notSameId i j = not (sameId i j)<br>
 startId = 1<br>
<br>
<br>
instance IDs Integer where<br>
<br>
<br>
<br>
-- are casts need here?<br>
sameId (newId startId::Integer) 3<br>
sameId (3::Integer) (4::Integer)<br>
notSameId (3::Integer) (newId (3::Integer))<br>
<br>
This message has been scanned for content and viruses by the DIT Information Services E-Mail Scanning Service, and is believed to be clean. <a href="http://www.dit.ie" target="_blank">http://www.dit.ie</a><br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">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>
</blockquote></div><br>
</div></div></blockquote></div><br>