2016-05-19 3 views
0

Так что мне нужно реализовать функция, которая принимает два списка и функцию. Затем функция использует элементы из двух списков и применяет функцию к элементам и сохраняет их в список с помощью карты и/или сбрасывания и функций из класса списка.Scala: zipWith [A, B, C] (f: Function2 [A, B, C], l1: List [A], l2: List [B]): List [C] Метод

Пример:

• zipWith ((х: Int, у: Int) => х + у, список (1, 2, 3), список (4, 5, 6)) → Список (5, 7, 9)

• zipWith ((x: Int, y: Int) => x, List (1,2,3), List (4,5,6)) → Список (1, 2, 3)

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

+1

Можете ли вы показать нам код, который вы написали для вашей идеи? –

+0

l1.zip (l2) .map {(A, B) => f (A, B)}, но я получаю ошибки совпадения типа, так как предполагаю, что я не могу использовать f в этой нотации. – Kiki

+0

Метод 'zip' возвращает список кортежей, поэтому здесь отсутствует совпадение шаблонов: l1.zip (l2) .map {case (a, b) => f (a, b)} –

ответ

0

Элегантное решение использует соответствующий шаблон:

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

Это вопрос домашней работы. Вместо того, чтобы отказаться от полного решения, вы должны осторожно направлять OP к решению ... – Jubobs

+0

Согласен, однако я «сбросил» решение до того, как OP упомянул об этом вопрос о домашнем задании ... –

+0

Мне очень жаль, это моя вина. – Kiki

0

Так как вы просили решение без сопоставления с образцом, я предлагаю следующее:

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

От movin г 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) 

 Смежные вопросы

  • Нет связанных вопросов^_^