ScalaのOption, Either, Try
Option[T]
型
Some[T]
もしくは None
を返す
Option[A]
は抽象クラスで、これを継承した Some[T]
クラス、 None
オブジェクト
method
isDefined
get
Noneのときは例外を投げる
scala // map系メソッドとmatchの比較
option.foreach(f)
option match {
case Some(v) => f(v)
case None => // 何もしない
}
option.map(f)
option match {
case Some(v) => Some(f(v))
case None => None
}
option.flatMap(f)
option match {
case Some(v) => f(v)
case None => None
}
otpion.getOrElse(defaultValue)
option match {
case Some(v) => v
case None => defaultValue
}
scala// 引数が両方SomeならSomeが返る。片方でもNoneならNoneが返る
def plus(n1: Option[Int], n2: Option[Int]): Option[Int] =
n1.flatMap(i => n2.map(j => i+j))
入れ子になって微妙に見づらいな

for..yield式を使ってこんなふうにもかける
scaladef plus(n1: Option[Int], n2: Option[Int]): Option[Int] =
for(i <- n1; j <- n2) yield i + j
forの中の i<-n1
のところで、モナドから値を取り出している感じ
Either[A, B]
型
Left[A, B]
もしくは Right[A, B]
を返す
Optionのときと同様のmethodに加えて、mergeなどがある
scalaeither.merge
eiteher match {
case Right(v) => v
case Left(v) => v
}
Try
型
Eitherと似ているが失敗時には例外を保持する
非同期処理の try/catch
では例外を捕捉できない
Success
もしくは Failure
を返す
Optionのときと同じようなmethocを使える
参考