Implement a minimal `Option` that has `map` and `flatMap`.
```scala
import scala.{Option => _}
// implement here
sealed trait Option[+A]{
def map[B](f: A => B): Option[B] = {
this match {
case None => None
case Some(a) = Some(f(a))
}
}
def flatMap[B](f: A => Option[B]): Option[B] = {
this match {
case None => None
case Some(a) => f(a)
}
}
def fold[B](f: A => B, g: => B): B = {
this match {
case None => g
case Some(a) => f(a)
}
}
}
o.fold(
f => f + 1,
0
)
List(1, 2, 3, 4).map(Int => Int) : List[Int]
List(1, 2, 3, 4).flatMap(A => List[B])
case class Some[+A](a: A) extends Option[A];
case object None extends Option[Nothing];
val n: ??? = None
foo(n)
def foo(animal: Option[Animal])
enum Option<A> {
None,
Some(A)
}
```