在scala中,为什么list.flatMap(List)不起作用?

Han*_*Sun 2 monads functional-programming scala

这很好用

val l = List(1,2,3)
l.flatMap(x => List(x))
Run Code Online (Sandbox Code Playgroud)

但这不起作用:

l.flatMap(List)
Run Code Online (Sandbox Code Playgroud)

这也不起作用:

l.flatmap(List.apply _)
Run Code Online (Sandbox Code Playgroud)

有没有人有这个想法?谢谢!

Mic*_*jac 7

对于List[A],flatMap期望一个函数来自A => GenTraversableOnce[B].List.apply在该特定语法中使用的问题是apply允许重复参数A*,这是语法糖Seq[A].所以List.apply真的是一个Seq[A] => List[A],这是不一样的A => List[A].我们可以在错误消息中看到:

scala> l.flatMap(List.apply)
<console>:9: error: polymorphic expression cannot be instantiated to expected type;
 found   : [A]Seq[A] => List[A]
 required: Int => scala.collection.GenTraversableOnce[?]
              l.flatMap(List.apply)
Run Code Online (Sandbox Code Playgroud)

您可以做的是明确表示您只使用一个参数:

scala> l.flatMap(List(_))
res5: List[Int] = List(1, 2, 3)

scala> l.flatMap(List.apply(_))
res6: List[Int] = List(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

并且l.flatMap(List)永远不会工作,因为List是一个阶级,而Scala不会用apply糖来生产它l.flatMap(List.apply).