Scala 如何从头开始编写zip函数

Scala 如何从头开始编写zip函数,scala,tuples,Scala,Tuples,如何编写zip函数,该函数将列表中对应的元素进行元组化。我知道zip是一个内置函数,但我正试图从头开始编写它 def zip[A,B](lst1: List[A], lst2: List[B]): List[(A, B)] 测试示例为: test("zip test 1") { assert(zip(List(1, 2, 3), List(4, 5, 6)) == List((1,4), (2, 5), (3, 6))) } 或字符串作为参数: test("zip test 2") { as

如何编写zip函数,该函数将列表中对应的元素进行元组化。我知道zip是一个内置函数,但我正试图从头开始编写它

def zip[A,B](lst1: List[A], lst2: List[B]): List[(A, B)]
测试示例为:

test("zip test 1") {
assert(zip(List(1, 2, 3), List(4, 5, 6)) == List((1,4), (2, 5), (3, 6)))
}
或字符串作为参数:

test("zip test 2") {
assert(zip(List("hey", "code"), List("world", "scala")) ==
List(("hey", "world"), ("code", "scala")))
}
到目前为止,我试过:

 def zip[A,B](lst1:List[A], lst2:List[B]):List[(A,B)] = (lst1,lst2) match{
    case Nil=> Nil
    case (h1::t1 :: h2 :: t2) =>zip(t1, t2)
 }

但是我得到了一个类型不匹配错误和一个不变性错误。

如果任一列表为空,则返回空列表。否则,请将一对头部预先固定到尾部拉链上:

def zip[A, B](xs: List[A], ys: List[B]): List[(A, B)] =
  (xs, ys) match {
    case (Nil, _) => Nil
    case (_, Nil) => Nil
    case (x :: xs, y :: ys) => (x, y) :: zip(xs, ys)
  }

扩展以利用尾部递归优化留给读者作为练习。

如果任一列表为空,则返回空列表。否则,请将一对头部预先固定到尾部拉链上:

def zip[A, B](xs: List[A], ys: List[B]): List[(A, B)] =
  (xs, ys) match {
    case (Nil, _) => Nil
    case (_, Nil) => Nil
    case (x :: xs, y :: ys) => (x, y) :: zip(xs, ys)
  }

扩展以利用尾部递归优化留给读者作为练习。

您尝试了什么?你被困在哪里?这似乎是一个“给我代码”的问题,目前我已经完成了基本情况,但我一直无法理解元组…(xy.\u 1 xy.\u 2)。我试图将其合并,但没有成功。我一直收到同样的清单。我的配对必须已关闭..编辑您的问题以包含您的尝试?您尝试了什么?你被困在哪里?这似乎是一个“给我代码”的问题,目前我已经完成了基本情况,但我一直无法理解元组…(xy.\u 1 xy.\u 2)。我试图将其合并,但没有成功。我一直收到同样的清单。我的配对必须已关闭。编辑您的问题以包含您的尝试?这无法编译:p您需要
列表[(A,B)]
作为返回类型,而不是
列表[A,B]
。您还可以将前两个案例分组为
case(Nil,)|(,Nil)=>Nil
@ukasz,现在可以了@Łukasz
case\u=>Nil
在最后一个位置可能也会起作用。@VictorMoroz是的,那更好。这不会编译:p您需要
List[(A,B)]
作为返回类型,而不是
List[A,B]
。您还可以将前两个案例分组为
case(Nil,)|(,Nil)=>Nil
@ukasz,现在可以了@Łukasz
case=>Nil
在最后一个位置可能也会起作用。@VictorMoroz是的,那更好。