【发布时间】:2018-12-14 17:23:55
【问题描述】:
我正在学习 Scala,并在下面的代码中使用 flatMap (取自filter with flatmap or collect)
我有
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 在List[Any] 的flatMap 中是可以接受的?
此外,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]
有人能解释一下吗?谢谢!!!
【问题讨论】: