如何从头开始编写zip函数

时间:2016-02-01 14:41:53

标签: 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") {
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)
 }

但是我遇到了类型不匹配错误和不可变性错误。

1 个答案:

答案 0 :(得分:5)

如果任一列表为空,则返回空列表。否则,将这对头部添加到尾部拉链上:

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

增加利用尾递归优化是留给读者的练习。