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 specificflatten
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 butflatMap(f)
is the same as.map(f).flatten
. Theflatten
operation 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 theflatten
operation.
It might be interesting to note thatOption[List[A]].flatten
triggers an error.
But this answer raise a new question, what happen to theOption
elements in the list !?
Remember thatOption
has two possible case. The first one isSome
when 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 theflatten
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") }