【问题标题】:Scala : zipWith[A,B,C](f: Function2[A,B,C], l1 :List[A], l2 :List[B]) : List[C] MethodScala : zipWith[A,B,C](f: Function2[A,B,C], l1 :List[A], l2 :List[B]) : List[C] 方法
【发布时间】:2016-09-16 23:13:09
【问题描述】:

所以我需要实现一个需要两个列表和一个函数的函数。然后该函数使用两个列表的元素并将该函数应用于元素,并通过使用 map 和/或 fold 以及列表类中的函数将它们保存到列表中。

例子:

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)

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

【问题讨论】:

  • 你能告诉我们你为你的想法编写的代码吗?
  • l1.zip(l2).map{ (A,B) => f(A,B) } 但我得到类型未匹配错误,因为我假设我不能在其中使用 f符号。
  • zip 方法返回一个元组列表,因此您在这里缺少模式匹配:l1.zip(l2).map{ case (a,b) => f(a,b) }
  • 我需要在不使用模式匹配和递归的情况下解决这个问题。但谢谢这也有效。
  • @Kiki 如果这是作业,您应该在问题中提及。

标签: list scala dictionary functional-programming fold


【解决方案1】:

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

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

【讨论】:

  • 这是一道作业题。与其放弃一个完整的解决方案,你应该轻轻地引导 OP 找到一个解决方案......
  • 我同意,但是在 OP 提到这是一个家庭作业问题之前,我“放弃”了解决方案......
  • 我真的很抱歉,这是我的错。
【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-31
    • 2010-11-27
    • 2019-10-23
    • 2021-04-03
    • 2018-06-29
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多