content: 
  -- Test that we don't have rules (or othre optimisations) doing the
  -- wrong thing for constant folding with Doubles.
  
  module Main (main) where
  
  zero :: Double
  zero = 0
  
  one :: Double
  one = 1
  
  nan :: Double
  nan = 0 / 0
  
  inf :: Double
  inf = 1 / 0
  
  neginf :: Double
  neginf = -1 / 0
  
  fzero :: Float
  fzero = 0
  
  fone :: Float
  fone = 1
  
  fnan :: Float
  fnan = 0 / 0
  
  finf :: Float
  finf = 1 / 0
  
  fneginf :: Float
  fneginf = -1 / 0
  
  main :: IO ()
  main = do putStrLn "=== Subtraction ==="
            print (zero - zero)
            print (zero - nan)
            print (zero - inf)
            print (zero - neginf)
            print (nan - zero)
            print (nan - nan)
            print (nan - inf)
            print (nan - neginf)
            print (inf - zero)
            print (inf - nan)
            print (inf - inf)
            print (inf - neginf)
            print (neginf - zero)
            print (neginf - nan)
            print (neginf - inf)
            print (neginf - neginf)
            putStrLn "=== Addition ==="
            print (zero + zero)
            print (zero + nan)
            print (zero + inf)
            print (zero + neginf)
            print (nan + zero)
            print (nan + nan)
            print (nan + inf)
            print (nan + neginf)
            print (inf + zero)
            print (inf + nan)
            print (inf + inf)
            print (inf + neginf)
            print (neginf + zero)
            print (neginf + nan)
            print (neginf + inf)
            print (neginf + neginf)
            putStrLn "=== Mutiplication ==="
            print (zero * zero)
            print (zero * one)
            print (zero * nan)
            print (zero * inf)
            print (zero * neginf)
            print (one * zero)
            print (one * one)
            print (one * nan)
            print (one * inf)
            print (one * neginf)
            print (nan * zero)
            print (nan * one)
            print (nan * nan)
            print (nan * inf)
            print (nan * neginf)
            print (inf * zero)
            print (inf * one)
            print (inf * nan)
            print (inf * inf)
            print (inf * neginf)
            print (neginf * zero)
            print (neginf * one)
            print (neginf * nan)
            print (neginf * inf)
            print (neginf * neginf)
            putStrLn "=== Division ==="
            print (zero / zero)
            print (zero / one)
            print (zero / nan)
            print (zero / inf)
            print (zero / neginf)
            print (one / zero)
            print (one / one)
            print (one / nan)
            print (one / inf)
            print (one / neginf)
            print (nan / zero)
            print (nan / one)
            print (nan / nan)
            print (nan / inf)
            print (nan / neginf)
            print (inf / zero)
            print (inf / one)
            print (inf / nan)
            print (inf / inf)
            print (inf / neginf)
            print (neginf / zero)
            print (neginf / one)
            print (neginf / nan)
            print (neginf / inf)
            print (neginf / neginf)
  
            putStrLn "=== Subtraction ==="
            print (fzero - fzero)
            print (fzero - fnan)
            print (fzero - finf)
            print (fzero - fneginf)
            print (fnan - fzero)
            print (fnan - fnan)
            print (fnan - finf)
            print (fnan - fneginf)
            print (finf - fzero)
            print (finf - fnan)
            print (finf - finf)
            print (finf - fneginf)
            print (fneginf - fzero)
            print (fneginf - fnan)
            print (fneginf - finf)
            print (fneginf - fneginf)
            putStrLn "=== Addition ==="
            print (fzero + fzero)
            print (fzero + fnan)
            print (fzero + finf)
            print (fzero + fneginf)
            print (fnan + fzero)
            print (fnan + fnan)
            print (fnan + finf)
            print (fnan + fneginf)
            print (finf + fzero)
            print (finf + fnan)
            print (finf + finf)
            print (finf + fneginf)
            print (fneginf + fzero)
            print (fneginf + fnan)
            print (fneginf + finf)
            print (fneginf + fneginf)
            putStrLn "=== Mutiplication ==="
            print (fzero * fzero)
            print (fzero * fone)
            print (fzero * fnan)
            print (fzero * finf)
            print (fzero * fneginf)
            print (fone * fzero)
            print (fone * fone)
            print (fone * fnan)
            print (fone * finf)
            print (fone * fneginf)
            print (fnan * fzero)
            print (fnan * fone)
            print (fnan * fnan)
            print (fnan * finf)
            print (fnan * fneginf)
            print (finf * fzero)
            print (finf * fone)
            print (finf * fnan)
            print (finf * finf)
            print (finf * fneginf)
            print (fneginf * fzero)
            print (fneginf * fone)
            print (fneginf * fnan)
            print (fneginf * finf)
            print (fneginf * fneginf)
            putStrLn "=== Division ==="
            print (fzero / fzero)
            print (fzero / fone)
            print (fzero / fnan)
            print (fzero / finf)
            print (fzero / fneginf)
            print (fone / fzero)
            print (fone / fone)
            print (fone / fnan)
            print (fone / finf)
            print (fone / fneginf)
            print (fnan / fzero)
            print (fnan / fone)
            print (fnan / fnan)
            print (fnan / finf)
            print (fnan / fneginf)
            print (finf / fzero)
            print (finf / fone)
            print (finf / fnan)
            print (finf / finf)
            print (finf / fneginf)
            print (fneginf / fzero)
            print (fneginf / fone)
            print (fneginf / fnan)
            print (fneginf / finf)
            print (fneginf / fneginf)
  
  