Scala澄清中的map函数

时间:2016-02-01 02:27:19

标签: scala

我很困惑如何编写映射两个列表的map函数:

例如:

def map[A,B,C](f: (A, B) => C, lst1: List[A], lst2: List[B]): List[C]

输入将是2个列表,输出可以是添加整数的列表

测试示例:

assert(map(add, List(1, 2, 3), List(4, 5, 6)) == List(5, 7, 9))

2 个答案:

答案 0 :(得分:5)

您可以使用security.oauth2.resource.userInfoUrif.tupled从接受参数f的函数转换为将一个参数作为元组(A, B) => C接受的函数。然后,您可以((A, B)) => C将这些列表放在一起(将它们作为一个元组列表)并使用传统的zip将其提供给f

map

请注意,如果两个列表的大小不同,则def map[A,B,C](f: (A, B) => C, lst1: List[A], lst2: List[B]): List[C] = (lst1 zip lst2) map f.tupled scala> def add(a: Int, b: Int): Int = a + b add: (a: Int, b: Int)Int scala> map(add, List(1, 2, 3), List(4, 5, 6)) res20: List[Int] = List(5, 7, 9) 会截断较长的列表以匹配较小的列表。

答案 1 :(得分:1)

如m-z的答案中所述,您可以压缩列表,然后映射元组列表。如果您想避免使用tupled,您可以明确地进行解构:

def map[A,B,C](f: (A, B) => C, lst1: List[A], lst2: List[B]): List[C] = {
  val zipped = lst1 zip lst2
  zipped.map { case (a,b) => f(a,b) }
}