File: quotOverflow.hs

package info (click to toggle)
ghc 9.10.3-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 169,260 kB
  • sloc: haskell: 713,564; ansic: 84,184; cpp: 30,255; javascript: 9,003; sh: 7,870; fortran: 3,527; python: 3,228; asm: 2,523; makefile: 2,329; yacc: 1,570; lisp: 532; xml: 196; perl: 111; csh: 2
file content (33 lines) | stat: -rw-r--r-- 1,165 bytes parent folder | download | duplicates (11)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

import Control.Exception as E

import Data.Int

main :: IO ()
main = do putStrLn "Int8"
          mapM_ p =<< (f :: IO [Either Int8 String])
          putStrLn "Int16"
          mapM_ p =<< (f :: IO [Either Int16 String])
          putStrLn "Int32"
          mapM_ p =<< (f :: IO [Either Int32 String])
          putStrLn "Int64"
          mapM_ p =<< (f :: IO [Either Int64 String])
          putStrLn "Int"
          mapM_ p =<< (f :: IO [Either Int String])
    where p (Left x) = print x
          p (Right e) = putStrLn e

f :: (Integral a, Bounded a) => IO [Either a String]
f = sequence [ g (minBound `div` (-1)),
               g (minBound `mod` (-1)),
               g (case minBound `divMod` (-1) of (x, _) -> x),
               g (case minBound `divMod` (-1) of (_, x) -> x),
               g (minBound `quot` (-1)),
               g (minBound `rem` (-1)),
               g (case minBound `quotRem` (-1) of (x, _) -> x),
               g (case minBound `quotRem` (-1) of (_, x) -> x) ]
    where g x = do x' <- evaluate x
                   return (Left x')
                `E.catch`
                   \e -> return (Right (show (e :: SomeException)))