[Haskell] Silent error

kudah kudahkukarek at gmail.com
Sat Feb 16 09:02:13 CET 2013


ghc's Int is 32-bit on 32-bit platforms, according to maxBound.

On Mon, 21 Jan 2013 02:26:34 +0100 Benoit T <benoit.triquet at gmail.com>
wrote:

> On Mon, Jan 21, 2013 at 01:17:17AM +0200, miphis at meta.ua wrote:
> > The program looks like this:
> > 
> > --***********************
> > factorial :: Int->Int
> > factorial n = product [1..n]
> > 
> > main = do
> >         print $ factorial 50
> > --***********************
> > 
> > And that yields "0" (no errors). Is it a bug or feature? :)
> 
> Int is fixed-size (*) and is expected to use modular arithmetics (**)
> therefore there is no notion of overflow, it just computes modulo
> maxBound::Int
> 
> You must have been using a 32-bit haskell, that uses full-word Int,
> such as HUGS, and it turns out that using 32-bit signed integers, you
> eventually get -2**31 (this happens for n==32) and then multiplying by
> any even integer yields 0 (34!==0).
> 
> GHC uses 31-bit or 63-bit Int (on 32- or 64-bit arch) and does not
> encounter this case before factorial 50 (however the answer is also
> not what you may have been expecting because it still doesn't fit).
> 
> cheers
> 
> *: this is specified in the standard
> **: this does not seem to be specified in the standard
> 



More information about the Haskell mailing list