Odd side effect of using chr

Gavin Lowe gavin.lowe@comlab.ox.ac.uk
Mon, 6 Jan 2003 15:45:00 GMT


I think I see what's going on.  

  Prelude> :t f where f n = snd( chr n , n^25 `mod` 18721 )
  let {...} in f :: Int -> Int
  Prelude> :t g where g n =  n^25 `mod` 18721
  let {...} in g :: Integral a => a -> a

In the case of f, the use of chr forces n to be an Int, so it's calculating
n^25 as an Int, which is 0 (because of arithmetic overflow).  In the case
of g, it's presumably using Integer, so gets the correct answer.

Writing

  Prelude> let f n = snd( chr n , fromInt n^25 `mod` 18721 ) in f 4

gives the right answer.

Gavin

> >From gavinl  Mon Jan  6 15:34:20 2003
> Date: Mon, 6 Jan 2003 15:34:19 GMT
> X-Authentication-Warning: client104.comlab: gavinl set sender to gavin.lowe@comlab.ox.ac.uk using -f
> From: Gavin Lowe <gavin.lowe@comlab.ox.ac.uk>
> CC: Gavin.Lowe@comlab.ox.ac.uk
> Reply-to: gavin.lowe@comlab.ox.ac.uk
> 
> Hi
> 
> I think this is a hugs bug.
> 
> If I calculate
> 
>   Prelude> let g n =  n^25 `mod` 18721  in g 4
> 
> I get
> 
>   17173
> 
> But then if I calculate
> 
>   Prelude> let f n = snd( chr n, n^25 `mod` 18721 ) in f 4
> 
> I get
> 
>   0
> 
> Which is different!  I think the former is correct, FWIW.  Replacing the
> "chr n" by something not involving chr and n gives 17173.
> 
> This is with Hugs Version December 2001, running on a SunBlade 100 with
> Solaris 9.
> 
> Gavin
> 
> --
> Gavin Lowe
> 
> Oxford University Computing Laboratory, Parks Road, Oxford, OX1 3QD.
> Phone: +44 1865 273841.  Fax: +44 1865 273839.
> E-mail: gavin.lowe@comlab.ox.ac.uk
> 
> The secret of all discoverers is that they regard nothing as impossible
>