Primitive types and Prelude shenanigans

Fergus Henderson fjh@cs.mu.oz.au
Wed, 21 Feb 2001 23:05:41 +1100


On 21-Feb-2001, Marcin 'Qrczak' Kowalczyk <qrczak@knm.org.pl> wrote:
> Wed, 21 Feb 2001 12:55:37 +1100, Fergus Henderson <fjh@cs.mu.oz.au> pisze:
> 
> > The documentation in the Haskell report does not say what
> > `fromInteger' should do for `Int', but the Hugs behaviour definitely
> > seems preferable, IMHO.
> 
> Sometimes yes. But for playing with Word8, Int8, CChar etc. it's
> sometimes needed to just cast bits without overflow checking, to
> convert between "signed bytes" and "unsigned bytes".

Both are desirable in different situations.  But if you want to ignore
overflow, you should have to say so explicitly.  `fromInteger' is
implicitly applied to literals, and implicit truncation is dangerous,
so `fromInteger' should not truncate.

There should be a different function for conversions that silently
truncate.  You can implement such a function yourself, of course,
e.g. as follows:

	trunc :: (Bounded a, Integral a) => Integer -> a
	trunc x = res
	   where min, max, size, modulus, result :: Integer
		 min = toInteger (minBound `asTypeOf` res)
		 max = toInteger (maxBound `asTypeOf` res)
		 size = max - min + 1
		 modulus = x `mod` size
		 result = if modulus > max then modulus - size else modulus
		 res = fromInteger result

But it is probably worth including something like this in the standard
library, perhaps as a type class method.

-- 
Fergus Henderson <fjh@cs.mu.oz.au>  |  "I have always known that the pursuit
                                    |  of excellence is a lethal habit"
WWW: <http://www.cs.mu.oz.au/~fjh>  |     -- the last words of T. S. Garp.