Haskell:
エラー処理

方法:

HaskellはMaybeEitherのような型を使って頑健にエラーを処理します。こちらが簡単な例です:

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の型システムは、これをはるかに起こりにくくする方法を提供します。MaybeEitherがありますが、ExceptionsIOなどの異なる状況に応じた他のものもあります。

Maybeはシンプルです:すべてが上手く行っていればJust何かが得られ、そうでなければNothingです。Eitherは一歩進んで、エラーメッセージ(Left)または成功した結果(Right)を返すことができます。

どちらも純粋で、つまり外の世界に干渉しないというのがHaskellにとって大きな取引です。私たちは、いくつかの他の言語に問題を起こしている未チェックの例外の落とし穴を避けます。

MaybeEitherだけで満足できない人のために、Control.Exceptionのようなライブラリが、例外を通じたより伝統的な手続き型のエラー処理を提供します。しかし、それらを過剰に使うことは複雑化を招くことがあるので、コミュニティはしばしば型に固執します。

参照

さらに深く掘り下げるには: