Scala : zipWith[A,B,C](f: Function2[A,B,C], l1 :List[A], l2 :List[B]) : List[C] 方法

Scala : zipWith[A,B,C](f: Function2[A,B,C], l1 :List[A], l2 :List[B]) : List[C] Method

所以我需要实现一个包含两个列表和一个函数的函数。然后该函数使用两个列表的元素并将该函数应用于元素并使用 map and/or fold 和列表 class.

中的函数将它们保存到列表中

示例:

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)

我不知道如何使用传递的函数并将其应用于两个列表。我的想法是压缩两个列表,然后将函数应用于压缩列表的每个元素。

优雅的解决方案是使用模式匹配:

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))
}

既然你问的是没有模式匹配的解决方案,我建议如下:

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)