Подтвердить что ты не робот

Что такое zip (функциональное программирование?)

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

4b9b3361

Ответ 1

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

Input:

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

Вывод:

[5, 7, 9]

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

Input:

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 

Ответ 2

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

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

например, скажем, у вас есть список с (1,2,3), а другой с ( "один", "два", "три" ) Если вы их застегнете вместе, вы получите List ((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, не зная функционального программирования, я думал, что он связан с форматом сжатия. После того, как я узнал больше о функциональном программировании, я использовал его все больше и больше.

Ответ 3

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

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

неверно, это должно быть:

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

или просто:

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

Ответ 4

Вы можете использовать следующий код в Python:


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

Ответ 5

Ответ Павла в значительной степени описывает его. Я просто предоставил пример F #:

let x = [1;2]
let y = ["hello"; "world"]
let z = Seq.zip x y

Значение z будет представлять собой последовательность, содержащую кортежи элементов в одной позиции из двух последовательностей:

[(1, "hello"); (2, "world")]