在scala,为什么';平面图(列表)工作吗?

在scala,为什么';平面图(列表)工作吗?,scala,functional-programming,monads,Scala,Functional Programming,Monads,这很有效 val l = List(1,2,3) l.flatMap(x => List(x)) 但这不起作用: l.flatMap(List) 这也不起作用: l.flatmap(List.apply _) 有人对此有想法吗?谢谢 这是因为使用varargs: def apply[A](xs: A*): List[A] 您正在寻找一种方法,可以将单个项转换为仅包含该项的列表。没有专门针对对象的方法。相反,它们提供了一种更通用的方法,可以接受任意数量的参数,从而允许您的第一条语句(

这很有效

val l = List(1,2,3)
l.flatMap(x => List(x))
但这不起作用:

l.flatMap(List)
这也不起作用:

l.flatmap(List.apply _)
有人对此有想法吗?谢谢

这是因为使用varargs:

def apply[A](xs: A*): List[A]
您正在寻找一种方法,可以将单个项转换为仅包含该项的列表。没有专门针对对象的方法。相反,它们提供了一种更通用的方法,可以接受任意数量的参数,从而允许您的第一条语句(
List(1,2,3)
)工作

您需要提供括号来创建一个只包含一个对象的
列表
,因此,在使用
通配符引用
应用
方法时,您也需要这样做:

val listOfOne = List(1)

l.flatMap(List(_))
l.flatMap(List.apply(_))

对于
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)

l.flatMap(List)
永远无法工作,因为
List
是一个类,Scala不会用
apply
sugar来处理它来生成
l.flatMap(List.apply)

,在第一个有效的示例中,您能解释一下为什么使用括号可以让Scala清楚地看到函数需要单参数而不是不使用括号吗
l平面地图列表(41;
由于您给出的原因不起作用,但括号起作用的是魔术。同样,您所说的括号也起作用,当您执行
l.flatMap(列表(*2))时,括号不起作用。
scala> l.flatMap(List(_))
res5: List[Int] = List(1, 2, 3)

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