I just thought I should add the results for hbc and nhc98 to this enumeration of woes, to further illustrate the difficulties.
i :: Int i = 0x7fffffff
i_plus_1 = i+1 -- ghc : -2147483648 -- hugs: -2147483648 -- nhc98: -2147483648 -- hbc: -2147483648
i_succ = succ i -- ghc : *** Exception: Prelude.Enum.succ{Int}: tried to take `succ' of maxBound -- hugs: -2147483648 -- nhc98: -2147483648 -- hbc: -2147483648
j :: Int j = 0x80000000 -- ghc : -2147483648 -- hugs: Program error: {primIntegerToInt 2147483648} -- nhc98: -2147483648 (+ warning: decimal constant is so large that it is unsigned) -- hbc: -2147483648
k :: Int k = 0x100000000 -- ghc : 0 -- hugs: Program error: {primIntegerToInt 4294967296} -- nhc98: 0 -- hbc: 0
i':: Integer i'= 0x7fffffff i_plus_1' = i+1 -- ghc : 2147483648 -- hugs: 2147483648 -- nhc98: 2147483648 -- hbc: 2147483648
i_succ' = succ i' -- ghc : 2147483648 -- hugs: -2147483648 -- nhc98: -2147483648 -- hbc: -2147483648
I think Hugs is wrong. Integer shouldn't wrap.
(Actually, ghc is `wrong': hbc, hugs and nhc98 match the Report's specification here: succ = toEnum . (+1) . fromEnum This is confirmed by the description of the semantics in section 3.10.)
succ 1.45 -- hugs: 2.0 -- ghci: 2.45 -- nhc98: 2.0000000000000000 -- hbc: 2.0
succ 1.99 -- hugs: 2.0 -- ghci: 2.99 -- nhc98: 2.0000000000000000 -- hbc: 2.0
succ 1.99999 -- hugs: 2.0 -- ghci: 2.99999 -- nhc98: 2.0000000000000000 -- hbc: 2.0
succ (-0.2) -- hugs: 1.0 -- ghci: 0.8 -- nhc98: 1.0000000000000000 -- hbc: 1.0
succ (-0.99999) -- hugs: 1.0 -- ghci: 9.99999999995449e-6 -- nhc98: 1.0000000000000000 -- hbc: 1.0
succ (-1.1) -- hugs: 0.0 -- ghci: -0.10000000000000009 -- nhc98: 0.0000000000000000 -- hbc: 0.0
Ghc does not follow the Report here either.
[1.0..2.5] -- hugs: [1.0,2.0,3.0] -- ghci: [1.0,2.0,3.0] -- nhc98: [1.0000000000000000,2.0000000000000000] -- hbc: [1.0,2.0,3.0]
[1.1..2.5] -- hugs: [1.1,2.1] -- ghci: [1.1,2.1] -- nhc98: [1.0000000000000000,2.0000000000000000] -- hbc: [1.1,2.1]
[1.1..3.0] -- hugs: [1.1,2.1,3.1] -- ghci: [1.1,2.1,3.1] -- nhc98: [1.0000000000000000,2.0000000000000000,3.0000000000000000] -- hbc: [1.1,2.1,3.1]
nhc98 is wrong for all the Double arithmetic sequences. Regards, Malcolm