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 specificflattenoperation 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 butflatMap(f)is the same as.map(f).flatten. Theflattenoperation will combine two layers of container ( monad ) into one. So it will combineList[List[A]]intoList[A]orOption[Option[A]]intoOption[A]for instance.

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

List[Option[A]]will be turned intoList[A]by theflattenoperation.

It might be interesting to note thatOption[List[A]].flattentriggers an error.

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

Remember thatOptionhas two possible case. The first one isSomewhen there is an element, those will simply be opened up and they will be transformed fromSome[A]toA. 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 theflattenoperation.

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