我知道它与Intellij(IntelliJ Community 2018)中元组的使用或错误有关,因为它报告了两种映射方法都需要f:(Int,String)=> B,但是当我提供这样的功能时,它告诉我我编译失败:
List(1, 2, 3).zip(List ("a", "b", "c")).map((a, b) => "blah") //this does not compile
(List(1, 2, 3), List("a", "b", "c")).zipped.map((a, b) => "blah") //this compiles
答案 0 :(得分:3)
List(1, 2, 3).zip(List ("a", "b", "c"))
创建一个List[(Int, String)]
。在.map
上调用List
时,必须传递一个仅带有一个参数的函数,在本例中为一个元组:(Int, String)
。您需要一个((Int, String)) => B
。
(List(1, 2, 3), List("a", "b", "c")).zipped
创建一个Tuple2Zipped[Int, List[Int], String, List[String]]
。该类的.map
方法必须提供一个带有两个参数的函数,其中第一个为Int
,第二个为String
。您需要一个(Int, String) => B
。
(a, b) => "blah"
是接受两个参数的函数的有效语法,而不是接受带有一个元组的单个参数的函数的有效语法。因此,对于后者,但对于前者,则没问题。
答案 1 :(得分:0)
这不是错误,您可以尝试在其他位置(例如playgrund here)上编译表达式。
对于您的情况,
List(1, 2, 3).zip(List ("a", "b", "c")).map((a, b) => "blah")
应改写为:
List(1, 2, 3).zip(List ("a", "b", "c")).map({case(a, b) => "blah"})
您应该元组 List(1, 2, 3).zip(List ("a", "b", "c"))
部分,使其能够像(a, b)
一样使用。
有关详细说明,请参见this post: