Add collection to None as initial value

I want to collapse the collection or Y and return the option [X]. I want to start with None. Like this...

def f(optX: Option[X], y: Y): Option[X]
val optX = collectionOfY.fold(None) { case (prev, y) => f(prev,y) }

adding unnecessary types to make it clear

val optX: Option[X] = collectionOfY.fold(None) { case (prev: Option[X], y: Y) => f(prev,y) }

However, the compiler cannot determine the type correctly, and I have to write it like this:

val xx: Option[X] = None
val optX = collectionOfY.fold(xx) { case (prev, y) => f(prev,y) }

What is the magic of Scala to write this?

Thanks Peter

+4
source share
3 answers

Just use foldLeftany of the following

... foldLeft(Option.empty[X]) ...or ... foldLeft(None: Option[X]) ...or... foldLeft[Option[X]](None) ...

, fold foldLeft. fold, A1 A, , fold, , .

, Option[List[Int]] <: Option[Seq[Int]] , Any :

List(Some(List(1,2,3))).fold[Option[Seq[Int]]](None)((_, _) => Some(Seq(1)))

> res2: Option[Seq[Int]] = Some(List(1))

, , Option[X] Y, Y - ie Y <: Option[X], fold , .

. singleton? .

+5

, fold

def fold[A1 >: A](z: A1)(op: (A1, A1) ⇒ A1): A1

, A, None Option[T]. ( ), , .

- None ( Nil):

val optX = collectionOfY.match {
  case Nil => None
  case x:xs => xs.fold(f(None,x)) {case (prev,y) => f(prev,y) }
}
+1

, , Option.fold, None Option.empty[X].

val optX = collectionOfY.fold(Option.empty[X]) { case (prev, y) => f(prev,y) }

Scala .

+1
source

All Articles