正格性フラグ

import qualified Control.Exception as CE

data Foo = Foo !Int -- 正格性フラグあり
data Bar = Bar Int

main = do "Foo"  `test` case Foo (3 `div` 0) of Foo _ -> "ok" 
          "Bar"  `test` case Bar (3 `div` 0) of Bar _ -> "ok"
          "Foo2" `test` case Foo (3 `div` 0) of _     -> "ok"
          "Bar2" `test` case Bar (3 `div` 0) of _     -> "ok"

test name val = do putStr $ name ++ " : "
                   putStrLn val `CE.catch` (\ e -> print e)

結果

Foo : divide by zero
Bar : ok
Foo2 : ok
Bar2 : ok

ふむ。
Prelude.catch と Control.Exception.catch の違いにしばし悩む。
http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Exception.html#4 によると

the Prelude version only catches the IO and user families of exceptions

らすい。
例外処理に IO モナドを使わないといけないのはちょっと面倒だ。