Scala:压缩列表上的地图不清楚
Scala: map on zipped lists unclear
为了作业,我不得不写一个函数
zipWith[A,B,C](f:Function2[A,B,C], l1:List[A], l2:List[B]) : List[C]
接受两个列表和一个函数,returns另一个列表。
例如:
zipWith((x: Int, y: Int) => x + y, List(1, 2, 3), List(4, 5, 6))
→ List(5, 7, 9)
所以我开始尝试压缩 l1 和 l2 并尝试映射结果列表:
(l1 zip l2) map ((x:A, y:B) => f(x,y))
给出一个"type mismatch: found: (A,B) => C, required: ((A,B)) => ?"
我研究了一下,找到了两个解决方案,但我不明白为什么会这样:
(l1, l2).zipped map ((x:A, y:B)) => f(x,y))
我签入了 REPL:
l1 zip l2 => List[(A, B)]
同时
(l1, l2).zipped => scala.runtime.Tuple2Zipped[A,List[A],B,List[B]]
在我看来,哪个更像 ((A,B)) 而不是 (A,B)?
有人可以解释一下吗?
另一种解决方案,
(l1 zip l2) map { case (x, y) => f(x, y) }
涉及一种隐藏类型的模式匹配(或者我的理解),我不应该将其用于作业。
List.zip
returns 元组列表,因此,当您 .map
它时,它需要一个函数,该函数采用 Tuple2
类型的单个参数,而不是两个单独的参数,如你所愿。如果你不能使用模式匹配,你可以明确地解构元组:l1 zip l2 map { ab => f(ab._1, ab._2) }
.
或者,如您所知,您可以使用 (l1, l2).zipped
。这 returns 是一种特殊类型 Tuple2Zipped
,而不是另一种情况下的集合。这种特殊类型有一个成员方法 map
,它接受一个需要两个参数的函数,这正是您所需要的。这就是它起作用的原因。
为了作业,我不得不写一个函数
zipWith[A,B,C](f:Function2[A,B,C], l1:List[A], l2:List[B]) : List[C]
接受两个列表和一个函数,returns另一个列表。 例如:
zipWith((x: Int, y: Int) => x + y, List(1, 2, 3), List(4, 5, 6))
→ List(5, 7, 9)
所以我开始尝试压缩 l1 和 l2 并尝试映射结果列表:
(l1 zip l2) map ((x:A, y:B) => f(x,y))
给出一个"type mismatch: found: (A,B) => C, required: ((A,B)) => ?"
我研究了一下,找到了两个解决方案,但我不明白为什么会这样:
(l1, l2).zipped map ((x:A, y:B)) => f(x,y))
我签入了 REPL:
l1 zip l2 => List[(A, B)]
同时
(l1, l2).zipped => scala.runtime.Tuple2Zipped[A,List[A],B,List[B]]
在我看来,哪个更像 ((A,B)) 而不是 (A,B)?
有人可以解释一下吗?
另一种解决方案,
(l1 zip l2) map { case (x, y) => f(x, y) }
涉及一种隐藏类型的模式匹配(或者我的理解),我不应该将其用于作业。
List.zip
returns 元组列表,因此,当您 .map
它时,它需要一个函数,该函数采用 Tuple2
类型的单个参数,而不是两个单独的参数,如你所愿。如果你不能使用模式匹配,你可以明确地解构元组:l1 zip l2 map { ab => f(ab._1, ab._2) }
.
或者,如您所知,您可以使用 (l1, l2).zipped
。这 returns 是一种特殊类型 Tuple2Zipped
,而不是另一种情况下的集合。这种特殊类型有一个成员方法 map
,它接受一个需要两个参数的函数,这正是您所需要的。这就是它起作用的原因。