如何编写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)
}
但是我遇到了类型不匹配错误和不可变性错误。
答案 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)
}
增加利用尾递归优化是留给读者的练习。