To add to this: There are other constants which are polymorphic, not only numbers. Examples where you could add type signatures to make the type explicit are the empty list &#39;[]&#39; and the &#39;Nothing&#39; constructor of &#39;Maybe a&#39;. Adding type signatures to these will not be type casts, but telling the compiler that you want to specialize the given polymorphic entity.<br>
<br>Abhay<br><br><br><div class="gmail_quote">On Wed, May 28, 2008 at 1:27 PM, Salvatore Insalaco &lt;<a href="mailto:kirby81@gmail.com">kirby81@gmail.com</a>&gt; wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
2008/5/28 PR Stanley &lt;<a href="mailto:prstanley@ntlworld.com">prstanley@ntlworld.com</a>&gt;:<br>
<div class="Ih2E3d">&gt; Hi<br>
&gt; (16 :: Float) is a perfectly legitimate statement although I&#39;m surprised<br>
&gt; that it&#39;s allowed in a type strong language such as Haskell. It&#39;s a bit like<br>
&gt; casting in good old C. What&#39;s going on here?<br>
<br>
</div>Don&#39;t worry: it&#39;s not a cast.<br>
Numeric constants like &quot;16&quot; in Haskell have polymorphic types:<br>
Prelude&gt; :t 16<br>
16 :: (Num t) =&gt; t<br>
Prelude&gt; :t 16.6<br>
16.6 :: (Fractional t) =&gt; t<br>
<br>
Writing &quot;16 :: Float&quot; you are simply making the type explicit, and you<br>
can do it only in the context of the typeclass.<br>
<br>
Prelude&gt; :t (16 :: Integer)<br>
(16 :: Integer) :: Integer<br>
<br>
This works because Integer is a type of the typeclass Num, but:<br>
Prelude&gt; :t (16.5 :: Integer)<br>
&lt;interactive&gt;:1:1:<br>
 &nbsp; &nbsp;No instance for (Fractional Integer)<br>
 &nbsp; &nbsp; &nbsp;arising from the literal `16.5&#39; at &lt;interactive&gt;:1:1-4<br>
 &nbsp; &nbsp;Possible fix: add an instance declaration for (Fractional Integer)<br>
<br>
This doesn&#39;t work. So everything is done at compile time, no casting<br>
(i.e. &quot;believe me compiler, this it a Float&quot;) involved.<br>
<br>
Notice that during binding the numeric constants&#39; type is always made<br>
explicit (if you want to know more, look for section 4.3.4 in the<br>
Haskell Report):<br>
Prelude&gt; let a = 3<br>
Prelude&gt; :t a<br>
a :: Integer<br>
<br>
Prelude&gt; let b = 3.3<br>
Prelude&gt; :t b<br>
b :: Double<br>
<br>
Prelude&gt; b :: Float<br>
&lt;interactive&gt;:1:0:<br>
 &nbsp; &nbsp;Couldn&#39;t match expected type `Float&#39; against inferred type `Double&#39;<br>
 &nbsp; &nbsp;In the expression: b :: Float<br>
 &nbsp; &nbsp;In the definition of `it&#39;: it = b :: Float<br>
<font color="#888888"><br>
<br>
Salvatore<br>
</font><div><div></div><div class="Wj3C7c">_______________________________________________<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>