Scala List of Option flatten

Recently ( as on December 2020 ), we have talked about List of Option on the Discord server so I thought we would dive in deeper here.

This specific flatten operation is not well documented but extremely useful in a lost of use cases. Today we are simply going to see how it works and later on we are going to see in what cases it can be useful.

We saw it before but flatMap(f) is the same as .map(f).flatten. The flatten operation will combine two layers of container ( monad ) into one. So it will combine List[List[A]] into List[A] or Option[Option[A]] into Option[A] for instance.

In this episode, we are looking at what happen in the specific case of List[Option[A]] when it is flatten.

List[Option[A]] will be turned into List[A] by the flatten operation.

It might be interesting to note that Option[List[A]].flatten triggers an error.

But this answer raise a new question, what happen to the Option elements in the list !?

Remember that Option has two possible case. The first one is Some when there is an element, those will simply be opened up and they will be transformed from Some[A] to A. For the second case, None, they will be removed from the list. So you will end up with potentially less element that you started with in the list after performing the flatten operation.

It would be equivalent of doing this:

val l: List[Option[A]] = ???

val r: List[A] = l 
  .filter{
    case Some(_) => true
    case None => false
  }
  .map {
     case Some(n) => n
     case None => throw new Exception("Cannot happen")
  }
Reveal more information and clues
Load Exercise