zip с Scala используя карту - PullRequest
       7

zip с Scala используя карту

0 голосов
/ 16 февраля 2020

Определить zipWith. Он должен сжать два списка, но вместо того, чтобы заархивировать элементы в кортеж, он должен использовать функцию для объединения двух элементов.

Пример: zipWith (List (1, 2, 3), List (10, 11, 12), (x: Int, y: Int) => x + y) Должен возвращаться: List (11,13,15)

использовать карту и zip.

def zipWith[A,B,C](xs: List[A], ys: List[B], f: (A, B) => C): List[C] = {
        val zs = xs.zip(ys)
        //I don't know how to do this because if myMap(zs, f) 

        //myMap takes a functin f:(a)=>b instead of f: (A, B) => C
    }
}

1 Ответ

1 голос
/ 16 февраля 2020

Звучит так, будто вы ищете что-то вроде этого:

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

Надеюсь, это поможет.

Обновление

Вот та же функция но будучи хвостово-рекурсивным:

    def zipWith[A, B, C](xs: List[A], ys: List[B], f: (A, B) => C): List[C] = {
      @tailrec
      def zipAccumulatingResult(xs: List[A], ys: List[B], f: (A, B) => C, acc: List[C]): List[C] = {
        (xs, ys) match {
          case (Nil, _) => acc
          case (_, Nil) => acc
          case (x :: xs, y :: ys) => zipAccumulatingResult(xs, ys, f, acc :+ f(x, y))
        }
      }

      zipAccumulatingResult(xs, ys, f, Nil)
    }
...