正格性フラグ
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 モナドを使わないといけないのはちょっと面倒だ。