【发布时间】:2017-11-21 00:34:15
【问题描述】:
首先,map 将 x => x 视为与 identity 相同
List(1,2,3).map(x => x) //res0: List[Int] = List(1, 2, 3)
List(1,2,3).map(identity) //res1: List[Int] = List(1, 2, 3)
现在让我们将 List[Option[Int]] 转换为 List[Int] 丢弃所有的 None。我们可以通过.flatten 做到这一点。但是这个问题的重点是了解flatMap如何对待identity
val maybeNums = List(Some(1), None, Some(-2), None, None, Some(33))
// Works OK, result = List[Int] = List(1, -2, 33)
maybeNums.flatMap(x => x)
maybeNums.flatMap(x => x.map(identity))
// Not working:
maybeNums.flatMap(identity)
Error:(5, 20) type mismatch;
found : Option[Int] => Option[Int]
required: Option[Int] => scala.collection.GenTraversableOnce[?]
问题:为什么maybeNums.flatMap(identity) 给出编译错误,而maybeNums.flatMap(x => x) 工作正常?
【问题讨论】:
-
我猜答案会以某种方式涉及 eta-expansion 以及如何键入部分应用的方法。