Either型(エラー処理に使う)

関数型プログラミングにおける**Either型は、計算の結果が「成功」か「失敗(エラー)」のいずれかであることを型レベルで表現するためのデータ型です。主に例外を使わずにエラーハンドリングを行う**手法として利用されます。Haskell、Scala、F#、TypeScript(FPライブラリ使用)などの関数型言語または関数型スタイルで広く用いられています。


1. Either型の基本構造

Either型は次のように2つのケース(コンストラクタ)を持ちます:

  • Left a:エラーや失敗を表す値(通常はエラー情報)

  • Right b:成功を表す値

haskell
data Either a b = Left a | Right b

ここで a はエラーの型、b は成功時の値の型です。


2. 使用目的と意義

Either型の目的は、関数の戻り値で成功と失敗の両方を明示的に扱うことです。例外を使う代わりに、呼び出し元に戻されたEither値をパターンマッチングなどで安全に処理します。

例:整数を文字列に変換する関数(Haskell風)

h
parseInt :: String -> Either String Int parseInt s = if all isDigit s then Right (read s) else Left "数字以外の文字が含まれています"

呼び出し側では次のように処理します:

haskell
case parseInt "123a" of Right n -> "成功:" ++ show n Left err -> "エラー:" ++ err

3. Option型との違い

意味のある失敗理由を持てるか 成功の有無だけ
Option(Maybe) ×(Noneに理由はない)
Either 〇(Leftに理由を含める) ×

Optionは「値がある/ない」を表現するのに対し、Eitherは**「失敗の理由を明示したい」場合に適します**。


4. 関数型スタイルでの合成(map / flatMap)

関数型言語では、Eitherモナドとして扱うことが多く、以下のような操作を通じてエラー処理を連鎖的に行うことができます。

map:成功している場合に関数を適用

scala
val result: Either[String, Int] = Right(10) val doubled = result.map(_ * 2) // Right(20)

flatMap:次の処理も失敗する可能性がある場合

scala
val result = Right(10): Either[String, Int] val finalResult = result.flatMap(x => if (x > 5) Right(x * 2) else Left("5以下の数値") ) // Right(20)

失敗が途中で発生すれば、それ以降の処理はスキップされ、最初のLeftが返されます。


5. エラーの蓄積と型安全性

  • Eitherは静的型付け言語で型安全にエラーと正常値を扱える

  • Trythrow/catchと異なり、副作用を持たず、予測可能なコードとなる。

  • Validated(ScalazやCats)などを使うと、複数のLeftのエラーを蓄積することも可能。


6. 利用例(Scala)

scala
def divide(a: Int, b: Int): Either[String, Int] = if (b == 0) Left("ゼロ除算エラー") else Right(a / b) val result = divide(10, 0) match { case Right(value) => s"結果は $value" case Left(error) => s"失敗:$error" }

まとめ

  • Eitherは関数型スタイルでの安全で明示的なエラーハンドリングを提供する。

  • Rightが成功、Leftが失敗を意味する。

  • mapflatMapで合成可能。

  • 失敗理由を含められるため、Optionよりも詳細なエラー管理が可能。

  • 副作用を避け、関数の純粋性と安全性を保つ設計に適している。

ご希望であれば、言語別のサンプル(Haskell、Scala、TypeScriptなど)も追加可能です。

生成日:2025/06/01