PR Stanley wrote:
Hi
(16 :: Float) is a perfectly legitimate statement although I'm surprised that it's allowed in a type strong language such as Haskell. It's a bit like casting in good old C. What's going on here?

It's not a type cast, it's a class method:

class Num n where
 ...
 fromInteger :: Integer -> n
 ...

The literal "16" is interpretted as the function call "fromInteger 16". If you write a literal, the compiler will usually optimise away the function call leaving only a literal Float/Double/Int/Word16/whatever.

Notice, however, that you can explicitly call this function yourself at any time to change the type of something. Note that this is *not* a type cast. It doesn't just change what type the type checker thinks the data is; it really does change the actual bit pattern in memory. (E.g., turning an Integer into a Word8, possibly causing the value to overflow and wrap around in the process!)

It's really no more mysterious than the way "show" can transform many kinds of data into a String, and "read" can transform them back again. It's not bypassing the type system, it's doing a real type conversion.

I hope that made sense...

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to