Я изучаю Scala и в приведенном ниже коде использую flatMap (взято из фильтровать с плоской картой или собирать)
У меня есть
list flatMap {
case st: String => Some(st)
case _ => None
}
Он работает на List[Any]
и дает List[String]
scala> List(1, "A") flatMap {
| case st: String => Some(st)
| case _ => None
| }
res21: List[String] = List(A)
Теперь я смущен types
здесь. Как я и думал, flatMap
работает с некоторыми видами monad
, которые работают как преобразование из M[M[A]] -> M[A]
.
Код ниже легко понять,
def flatten(ls: List[Any]): List[Any] = ls flatMap {
case ms: List[_] => flatten(ms)
case e => List(e)
}
так как оба случая возвращают List[Any]
, который по-прежнему имеет тот же тип, что и ls: List[Any]
.
Но почему Some[String]
и None
допустимы в flatMap
List[Any]
?
Кроме того, кажется, что None
полностью игнорируется, а не рассматривается как серьезное значение? Я думал, что, возможно, есть какие-то шаги по сжатию, чтобы избавиться от таких значений, например:
[1,2,3].concat([,,2,2])
// => (6) [1, 2, 3, empty × 2, 2]
[1,2,3].concat([,,4]).filter(Boolean)
// => (4) [1,2,3,4]
Может ли кто-нибудь объяснить это? Спасибо!!!