5. Option型
成功したときの値をもつSomeと、
失敗を表すNoneからなる型
sealed abstract class Option[+A]
!
case class Some[+A](x: A) extends Option[A]
!
case object None extends Option[Nothing]
6. 1 sealed abstract class Option[+A] {
2 //値があるか判定
3 def isEmpty: Boolean
4 //値を取得
5 def get: A
6 //値を取得し、取得できなかった場合はデフォルト値を使用
7 final def getOrElse[B >: A](default: => B): B
8 //値に対してfを適用したOptionを返す
9 final def map[B](f: A => B): Option[B]
10 //値に対して失敗する可能性のあるfを適用したOptionを返す
11 final def flatMap[B](f: A => Option[B]): Option[B]
12 //述語関数を満たす値のOptionを取得
13 final def filter(p: A => Boolean): Option[A]
14 //値がなければデフォルトのOptionを返す
15 final def orElse[B >: A](alternative: => Option[B]): Option[B]
16 }
17
18 final case class Some[+A](x: A) extends Option[A] {
19 def isEmpty = false
20 def get = x
21 }
22
23 case object None extends Option[Nothing] {
24 def isEmpty = true
25 def get = throw new NoSuchElementException("None.get")
26 }
12. for内包表記による合成
1 val one = stringToInt("1")
2 val two = stringToInt("2")
3 val fail = stringToInt("hello")
4
5 for {
6 o <- one
7 t <- two
8 } yield o + t
9 //res1: Option[Int] = Some(3)
10
11 for {
12 o <- one
13 f <- fail
14 } yield o + f
15 //res2: Option[Int] = None
16
17 for {
18 o <- one
19 t <- two
20 th <- optionPlus(one,two)
21 } yield o + t + th
22 //res3: Option[Int] = Some(6)
左の式は右と等価
one.flatMap(o =>
two.map(t => o + t))
//res1: Option[Int] = Some(3)
!
!
!
one.flatMap(o =>
fail.map(f => o + f))
//res2: Option[Int] = None
!
!
!
one.flatMap(o =>
two.flatMap(t =>
optionPlus(one,two).map(th =>
o + t + th)))
//res3: Option[Int] = Some(6)