所以我需要实现一个带有两个列表和一个函数的函数。然后,该函数使用两个列表的元素,并在元素上应用函数,并使用map和/或fold以及list类中的函数将它们保存到列表中。
示例:
•zipWith((x:Int,y:Int)=> x + y,List(1,2,3),List(4,5,6)) →列表(5,7,9)
•zipWith((x:Int,y:Int)=> x,List(1,2,3),List(4,5,6)) →列表(1,2,3)
我不知道如何使用传递的函数并将其应用于两个列表。我的想法是压缩两个列表,然后将该函数应用于压缩列表的每个元素。
答案 0 :(得分:0)
优雅的解决方案是使用模式匹配:
def zipWith[A, B, C](f: (A, B) => C, l1: List[A], l2: List[B]): List[C] = {
l1.zip(l2).map { case (x1, x2) => f(x1, x2) }
}
要在没有模式匹配的情况下解决此问题,您只需要直接访问元组的字段:
def zipWith[A, B, C](f: (A, B) => C, l1: List[A], l2: List[B]): List[C] = {
l1.zip(l2).map(tuple => f(tuple._1, tuple._2))
}
答案 1 :(得分:0)
由于您要求的解决方案没有模式匹配,我建议如下:
def zipWith[A, B, C](a: List[A], b: List[B])(f: (A, B) => C): List[C] = {
a.zip(b).map { tuple =>
f(tuple._1, tuple._2)
}
}
通过将f
移动到单独的参数列表,您的调用可能会显着缩短:
val a = List(1, 2, 3)
val b = List(4, 5, 6)
zipWith(a, b)(_ + _) // List(5, 7, 9)
zipWith(a, b)(_ * _) // List(4, 10, 18)