由于无法找到该问题的现有问题,我感到非常惊讶.为什么这样,给出:
val p: Int => Option[Int] = Some(_)
List(1, 2, 3).flatMap(p)
Run Code Online (Sandbox Code Playgroud)
我越来越:
<console>:14: error: type mismatch;
found : Int => Option[Int]
required: Int => scala.collection.GenTraversableOnce[?]
List(1, 2, 3).flatMap(p)
Run Code Online (Sandbox Code Playgroud)
但是如果我用这个替换最后一行,它会按预期编译并工作:
List(1, 2, 3).flatMap(p(_))
Run Code Online (Sandbox Code Playgroud)
我对这个问题的看法是,在p(_)类型推理系统的情况下,决定lambda的类型,以及它找到适当的隐式转换的方式Option[Int](option2Iterable我相信).只是p,类型已知,并且它是不正确的,因此不会尝试转换(并且没有转换Function1返回Option到Function1返回GenTraversableOnce).
这个推理是对的吗?如果是这样,有什么理由我不应该将此报告为错误/问题?
编辑:一个新的转折:我已经看到p.apply在一些(遗憾的)删除的评论中提到(虽然这是关于编码风格).令人惊讶的是,它的效果一样好p(_).
scala ×1