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)
有没有人有这个想法?谢谢!
对于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).