为什么我不能使用下划线对List [Option]进行flatMap?

时间:2016-06-02 17:37:48

标签: scala

我为什么要写

val flat: List[Int] = List(Some(1), Some(2)).flatMap(i => i)

但不是

val flat: List[Int] = List(Some(1), Some(2)).flatMap(_)

3 个答案:

答案 0 :(得分:7)

下划线是变量的占位符。它本身并不是一种功能。 flatMap需要一个功能。

此外,在这种情况下,有一个flatten方法在List上定义,OptionPredef内有一个隐式转换,这样你就可以&# 39;写完可以简化为那个电话,List(Some(1)).flatten

答案 1 :(得分:2)

下划线List(Some(1), Some(2)).flatMap(_)的规则是x => List(Some(1), Some(2)).flatMap(x)的缩写,而不是List(Some(1), Some(2)).flatMap(x => x)

答案 2 :(得分:0)

简短的回答是下划线可以引用身份映射,例如x => x flatMap需要映射到TraversableOnce[U],例如项目列表。

例如,List(1, 2).flatMap(Seq(_))有效。 List(1, 2).map(_ + 2)也有效。第一个是身份映射,第二个将返回List(3, 4)

但是,如果在flatMap map(多个运算符)中进行了复杂的转换,则必须正确编写lambda函数,否则编译器无法正确推断该类型。请参阅Scala unexpectedly not being able to ascertain type for expanded function