Я изучаю 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]
Может кто-нибудь объяснить это? Спасибо !!!