Вопрос по zip, functional-programming, clojure – Что такое zip (функциональное программирование?)

41

Я недавно видел некоторые Clojure или Scala (извините, я не знаком с ними), и они сделали zip в списке или что-то в этом роде. Что такое почтовый индекс и откуда он взялся?

Ваш Ответ

4   ответа
71

ходную последовательность, в которой каждые два элемента из входных последовательностей в одной и той же позиции объединяются с использованием некоторой функции. Пример в Хаскеле:

Входные данные:

zipWith (+) [1, 2, 3] [4, 5, 6]

Выход:

[5, 7, 9]

Выше приведено более общее определение; иногда,zip конкретно относится к объединению элементов в виде кортежей. Например. снова в Хаскеле:

Входные данные:

zip [1, 2, 3] [4, 5, 6]

Выход:

[(1, 4), (2, 5), (3, 6)]

А более общая версия называется «zip with». Вы можете рассмотреть "zip" в качестве особого случая "zipWith":

zip xs ys = zipWith (\x y -> (xs, ys)) xs ys 
не эквивалентен в скале. В Scala вам нужно будет сделать zip, а затем карту
Трудно сказать, что он использует, я имею в виду "Я недавно видел некоторые Clojure или Scala". не совсем определенно :)
Функция zip, использующая zipWith, уродлива и неправильна. Функция передана в zip с первым параметром ... и гораздо приятнее записать zip как zip = zipWith (,)
Ну, тогда это не совсем "не эквивалентно", это просто то, чего нет у Scala.zipWith, Очевидно, вы можете сделать либо - определитьzip с точки зренияzipWithили определитьzipWith с точки зренияzip а такжеmap.
Спасибо, теперь я получил это ясно! Robert Gould
20

такой как map или fold. Вы найдете эти функции в ранних выпусках вплоть до ruby и python. Они предназначены для выполнения общих пакетных операций со списками.

В этом конкретном случае zip берет два списка и создает новый список кортежей из этих списков.

например, допустим, у вас есть список с (1,2,3), а другой - с («один», «два», «три») Если вы объедините их вместе, вы получите список ((1, «один»), (2, «два»), (3, «три»))

или из командной строки Scala вы получите:

scala> List(1,2,3).zip(List("one","two","three"))
res2: List[(Int, java.lang.String)] = List((1,one), (2,two), (3,three))

Когда я впервые увидел его в Python, не зная функционального программирования, я подумал, что это связано с форматом сжатия. После того, как я узнал больше о функциональном программировании, я использовал его все больше и больше.

Обычно, когда вы используете метод zip или, другими словами, каков типичный вариант использования zip в реальных проектах?
9

у меня недостаточно очков, чтобы даже оставить комментарий к верхнему ответу, но

zip xs ys = zipWith xs ys (\x y -> (xs, ys))

являетсяwrong, так должно быть:

zip xs ys = zipWith (\x y -> (x,y)) xs ys

или просто:

zip = zipWith (\x y -> (x,y))
zip = zipWith (,)
7


>>> a = [1,2]
>>> b = [3,4]
>>> zip(a,b)
[(1,3),(2,4)]

Похожие вопросы