問題を解きながら、MyOption型をテストがパスするように実装してみましょう。
object MyOption {
def apply[A](x: A): MyOption[A]
}
sealed trait MyOption[+A] {
def get: A
def getOrElse[B >: A](elseValue: B):B
def isEmpty: Boolean
}
sealed trait MyOption[+A] {
def map[B](f: A => B): MyOption[B]
def flatMap[B](f: A => MyOption[B]): MyOption[B]
def filter(f: A => Boolean): MyOption[A]
}
sealed trait MyOption[+A] {
def orElse[B >: A](elseValue: => MyOption[B]): MyOption[B]
object MyOption {
def translateToForComprehensions1: MyOption[Int] = {
MyOption(1).flatMap { one =>
MyOption(2).flatMap { two =>
MyOption(3).map { three =>
one + two + three
}
}
}
}
def translateToForComprehensions2: MyOption[Int] = {
MyOption(1).flatMap { one =>
MyOption(-2).withFilter(_ > 0).flatMap { two =>
MyOption(3).map { three =>
one + two + three
}
}
}
}
}