Первый для понимания "десугарс" в:
val x = Option(1).flatMap(
i => Option(2).flatMap(
j => Option(3).map(
k => (i, j, k)
)
)
)
Как вы можете видеть - первая опция отображается плоско с помощью функции, которая принимает свое значение (если оно существует) и возвращает 3-кортеж (используя аналогичную операцию для второй опции). Независимо от того, что это за функция - все выражение имеет вид:
val x = Option(1).flatMap(f)
Теперь, если мы заменим Option(1)
на None
(как вы это сделали во втором выражении), мы бы ясно получили None
:
val x = None.flatMap(f) // None, for any f
Результат, который вы ожидали (Some((None, 2, 3))
), не слишком полезен - поскольку он будет иметь различных типов для разных входных данных: будет ли (Option[Int], Int, Int)
? Или (Int, Int, Int)
? Или (Option[Int], Option[Int], Option[Int])
? Действительно, единственный распространенный тип для (None, 2, 3)
, (1, None, 3)
и (1, 2, None)
- это не очень полезный (Any, Any, Any)
.