Scala:压缩列表上的地图不清楚

1 zip dictionary scala list

对于作业,我必须编写一个函数

zipWith[A,B,C](f:Function2[A,B,C], l1:List[A], l2:List[B]) : List[C]
Run Code Online (Sandbox Code Playgroud)

这需要两个列表和一个函数,并返回另一个列表.例如:

zipWith((x: Int, y: Int) => x + y, List(1, 2, 3), List(4, 5, 6))
    ? List(5, 7, 9)
Run Code Online (Sandbox Code Playgroud)

所以我去了它并压缩l1和l2并尝试映射结果列表:

(l1 zip l2) map ((x:A, y:B) => f(x,y))
Run Code Online (Sandbox Code Playgroud)

给出"类型不匹配:找到:(A,B)=> C,必需:((A,B))=>?"

我研究了一下,找到了两个解决方案,但我不明白为什么这个有效:

(l1, l2).zipped map ((x:A, y:B)) => f(x,y))
Run Code Online (Sandbox Code Playgroud)

我检查了REPL:

l1 zip l2 => List[(A, B)] 
Run Code Online (Sandbox Code Playgroud)

(l1, l2).zipped => scala.runtime.Tuple2Zipped[A,List[A],B,List[B]] 
Run Code Online (Sandbox Code Playgroud)

在我看来,((A,B))看起来不像(A,B)?

有人可以解释一下吗?

另一个解决方案,

(l1 zip l2) map { case (x, y) => f(x, y) }
Run Code Online (Sandbox Code Playgroud)

涉及隐藏类型的模式匹配(或者我理解),我不应该用于分配.

Dim*_*ima 5

List.zip返回一个元组列表,所以,当你.map它,它需要一个函数,它接受一个类型的参数Tuple2,而不是你想要的两个单独的参数.如果你不能使用模式匹配,你可以明确地解构元组:l1 zip l2 map { ab => f(ab._1, ab._2) }.

或者,正如您所知,您可以使用(l1, l2).zipped.这将返回一个特殊类型Tuple2Zipped,而不是像其他情况一样只返回一个集合.这种特殊类型有一个成员方法map,它需要一个期望两个参数的函数,这正是你需要的.这就是它起作用的原因.