エラーに対する Either
Left と Right です。
「エラーに対する Either」はCoddyKit上の無料Scala for Backend Engineering & Functional Programmingレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはScala for Backend Engineering & Functional Programming学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
なぜ Either なのか
Either は、2 つの可能性のいずれかになる値を表します。失敗の情報を伴って失敗する可能性がある計算をモデル化する慣用的な方法です。
Leftには慣例としてエラーを格納します。Rightには慣例として成功した値を格納します。
単に何かが存在しないことだけを知らせる Option とは異なり、Either は何が問題だったのかを知らせます。
Either 型
Either[A, B] は、2 つのサブタイプ Left[A] と Right[B] を持つ sealed trait です。
覚え方は、Right is right(正しい)で、Left はエラーです。この慣例により、map と flatMap は成功側に対して自動的に動作します。
val ok: Either[String, Int] = Right(42)
val err: Either[String, Int] = Left("boom")
println(ok)
println(err)関数から Either を返す
失敗する可能性のある関数は、例外をスローする代わりに Either を返します。呼び出し側では、両方の結果を明示的に処理できます。
object Main {
def parseAge(s: String): Either[String, Int] =
s.toIntOption match {
case Some(n) if n >= 0 => Right(n)
case Some(_) => Left("age cannot be negative")
case None => Left("not a number")
}
def main(args: Array[String]): Unit = {
println(parseAge("30"))
println(parseAge("-5"))
println(parseAge("x"))
}
}Either のパターンマッチング
Either を扱う最も直接的な方法は、パターンマッチングです。Left と Right を別々に処理します。
@main def run(): Unit = {
val result: Either[String, Int] = Right(10)
val msg = result match {
case Right(value) => s"Got value: $value"
case Left(error) => s"Failed: $error"
}
println(msg)
}fold: 両方の側をまとめる
fold は、Left 用と Right 用の 2 つの関数を受け取り、共通の型の単一の結果を生成します。
値を取得したい場合に、パターンマッチングを簡潔に置き換えられます。
@main def run(): Unit = {
val r: Either[String, Int] = Right(7)
val label = r.fold(
err => s"error: $err",
num => s"double is ${num * 2}"
)
println(label)
}map は Right に対して動作する
map は Right の値を変換し、Left はそのままにします。これは Scala の Either における右偏向の動作です(2.12 以降)。
@main def run(): Unit = {
val ok: Either[String, Int] = Right(5)
val no: Either[String, Int] = Left("missing")
println(ok.map(_ + 1))
println(no.map(_ + 1))
}getOrElse とデフォルト値
getOrElse は Right の値を取り出し、Either が Left の場合は代替値を返します。
@main def run(): Unit = {
val ok: Either[String, Int] = Right(99)
val no: Either[String, Int] = Left("oops")
println(ok.getOrElse(0))
println(no.getOrElse(0))
}swap: 左右を入れ替える
swap は Left と Right を入れ替えます。右偏向のメソッドを使ってエラー側を操作したい場合に便利です。
@main def run(): Unit = {
val err: Either[String, Int] = Left("bad input")
val swapped = err.swap.map(_.toUpperCase)
println(swapped)
}isLeft と isRight
簡単な真偽値チェックを使えば、完全なパターンマッチングを行わずに分岐できます。
isRightは成功の場合に true を返します。isLeftはエラーの場合に true を返します。
@main def run(): Unit = {
val r: Either[String, Int] = Right(1)
println(r.isRight)
println(r.isLeft)
}toOption: エラーを破棄する
失敗した理由が不要になった場合、toOption は Either を Option に変換します。Right(x) は Some(x) に、Left(_) は None になります。
@main def run(): Unit = {
val ok: Either[String, Int] = Right(3)
val no: Either[String, Int] = Left("err")
println(ok.toOption)
println(no.toOption)
}バリデーションの例
ここまでの内容を組み合わせて、ユーザー名を検証し、失敗時には型付きエラーを返します。
object Main {
def validate(name: String): Either[String, String] =
if (name.isEmpty) Left("empty name")
else if (name.length > 10) Left("name too long")
else Right(name)
def main(args: Array[String]): Unit = {
println(validate("alice"))
println(validate(""))
println(validate("verylongusername"))
}
}確認問題
Either の慣例についての理解を確認しましょう。
まとめ
Either を使ってエラーをモデル化する方法を学びました。
Right= 成功、Left= エラー(右偏向)です。- パターンマッチングまたは
foldで処理します。 mapで成功値を変換し、getOrElseでデフォルト値を指定します。swapで左右を入れ替え、toOptionで変換します。
次は、Try を使って例外を処理します。
よくある質問
「エラーに対する Either」レッスンは無料ですか?
はい。「エラーに対する Either」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Scala for Backend Engineering & Functional Programmingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
「エラーに対する Either」で何を学びますか?
Left と Right です。 ブラウザで直接実行するハンズオンコードでScala for Backend Engineering & Functional Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Scala for Backend Engineering & Functional Programmingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのScala for Backend Engineering & Functional Programmingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「エラーに対する Either」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このScala for Backend Engineering & Functional Programmingレッスンでコードを書いて実行できますか?
はい。すべてのScala for Backend Engineering & Functional Programmingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- エラーに対する Either
- Try、Success、Failure
- Either の合成
- 型の相互変換