初めてまともに使った。エラー抽象化できるのは気分が良い。
% runghc
{-# LANGUAGE ScopedTypeVariables #-}
import Control.Monad.Error.Class
safeHead :: (Error e, MonadError e m) => [a] -> m a
safeHead (x:_) = return x
safeHead [] = throwError $ strMsg "NG"
main :: IO ()
main = let try = do
(n :: Int) <- safeHead [3 ..]
putStrLn $ show n
(m :: Int) <- safeHead []
putStrLn $ show m
return ()
in try `catchError` (\e -> print e)
【実行結果】
3
user error (NG)