Haskell:
エラー処理
方法:
HaskellはMaybe
やEither
のような型を使って頑健にエラーを処理します。こちらが簡単な例です:
safeDivide :: Integral a => a -> a -> Maybe a
safeDivide _ 0 = Nothing -- ゼロで割ることはできないので、Nothingを返します。
safeDivide x y = Just (x `div` y) -- それ以外の場合は問題ないので、結果をJustに入れて返します。
-- 動作例を見てみましょう:
example1 :: Maybe Int
example1 = safeDivide 10 2 -- Just 5
example2 :: Maybe Int
example2 = safeDivide 10 0 -- Nothing
より複雑なエラー処理のためには、Either
が登場します:
safeDivideEither :: Integral a => a -> a -> Either String a
safeDivideEither _ 0 = Left "Divide by zero error." -- 今回はエラーにメッセージが添えられます。
safeDivideEither x y = Right (x `div` y)
-- 使用例:
example3 :: Either String Int
example3 = safeDivideEither 10 2 -- Right 5
example4 :: Either String Int
example4 = safeDivideEither 10 0 -- Left "Divide by zero error."
深掘り
Haskellの世界では、エラー処理は長い歴史を持っています。昔はエラーがプログラム全体を停止させてしまうこともありました―楽しくありません。Haskellの型システムは、これをはるかに起こりにくくする方法を提供します。Maybe
やEither
がありますが、Exceptions
やIO
などの異なる状況に応じた他のものもあります。
Maybe
はシンプルです:すべてが上手く行っていればJust
何かが得られ、そうでなければNothing
です。Either
は一歩進んで、エラーメッセージ(Left
)または成功した結果(Right
)を返すことができます。
どちらも純粋で、つまり外の世界に干渉しないというのがHaskellにとって大きな取引です。私たちは、いくつかの他の言語に問題を起こしている未チェックの例外の落とし穴を避けます。
Maybe
やEither
だけで満足できない人のために、Control.Exception
のようなライブラリが、例外を通じたより伝統的な手続き型のエラー処理を提供します。しかし、それらを過剰に使うことは複雑化を招くことがあるので、コミュニティはしばしば型に固執します。
参照
さらに深く掘り下げるには:
- Haskell自身のドキュメント: Haskell
- 初心者に最適: “Learn You a Haskell for Great Good!”