[project @ 2000-05-28 20:45:45 by panne]
authorpanne <unknown>
Sun, 28 May 2000 20:45:45 +0000 (20:45 +0000)
committerpanne <unknown>
Sun, 28 May 2000 20:45:45 +0000 (20:45 +0000)
Rewrote RULES for gcd and lcm without forall. The old versions *did
not* always fire because of a strange interaction with automatically
generated specialisations for gcd! Example for this misbehaviour:

   main :: IO ()
   main = do
      print (gcd             15675            156750 :: Integer)
      print (gcd 12345678987651075            156750 :: Integer)
      print (gcd            156750 12345678987651075 :: Integer)
      print (gcd  2469135797530215 12345678987651075 :: Integer)

I don't understand why the new version works and the old one did not,
so somebody else should probably have a look at this phenomenon.

*please merge* (like all my commits in the last few days :-}

ghc/lib/std/PrelReal.lhs

index e6d64d5..06551b6 100644 (file)
@@ -306,8 +306,8 @@ lcm x y             =  abs ((x `quot` (gcd x y)) * y)
 
 
 {-# RULES
-"Int.gcd"      forall a b . gcd  a b = gcdInt a b
-"Integer.gcd"  forall a b . gcd  a b = gcdInteger  a b
-"Integer.lcm"  forall a b . lcm  a b = lcmInteger  a b
+"gcd/Int->Int->Int"             gcd = gcdInt
+"gcd/Integer->Integer->Integer" gcd = gcdInteger
+"lcm/Integer->Integer->Integer" lcm = lcmInteger
  #-}
 \end{code}