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

时间:2016-05-19 21:03:50

标签: list scala dictionary functional-programming fold

所以我需要实现一个带有两个列表和一个函数的函数。然后,该函数使用两个列表的元素,并在元素上应用函数,并使用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)

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

2 个答案:

答案 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)