Eitherモナド
計算の結果が「成功」か「失敗」のどちらかである状況を安全に扱うためのモナド
言語によってはResultモナドという
概要
以下のように結果の「成功」か「失敗」を型システムで扱うことできる
Eitherモナド (Scala)
成功:Right
失敗:Left
Leftは必ずしもエラーを扱うためのものではなく、サイドケースを扱うために利用することもOK
Resultモナド (Rust, Kotlin)
成功:Ok
失敗:Err
サンプルコード
Eitherを使ったコード
code:scala
s.toIntOption.toRight(s"Can`t convert $s to Int")
}
map:成功(Right)の場合に処理を適応。失敗(Left)の場合はそのまま
code:scala
// Either を使った操作
val result = parseInt("123").map(_ * 2) // Right(246)
val errorResult = parseInt("abc").map(_ * 2) // Left("Cannot parse 'abc' as an Int")
println(result) // Right(246)
println(errorResult) // Left("Cannot parse 'abc' as an Int")
flatMap:成功の場合に次のモナドに接続(ネストを解消)
code:scala
if (n % 2 == 0) Right(n / 2) else Left(s"$n is not even")
val chainedResult = parseInt("42").flatMap(halfIfEven) // Right(21)
val errorChained = parseInt("41").flatMap(halfIfEven) // Left("41 is not even")
println(chainedResult) // Right(21)
println(errorChained) // Left("41 is not even")
pure :成功値(Right)を生成するために使用。値をRightの形でEitherモナドに包むことができる
code:scala
val value = 42
println(either) // Right(42)