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

Смотрите на проект Commons CLI, много хорошего материала там.

44
задан Alex Miller 22 July 2016 в 21:45
поделиться

5 ответов

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

Вход:

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

Выход:

[5, 7, 9]

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

Вход:

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 
73
ответ дан 26 November 2019 в 21:48
поделиться

zip - это распространенный метод функционального программирования, такой как map или fold. Вы найдете эти функции в ранних шепелявках, вплоть до ruby ​​и python. Если вы объедините их вместе, вы получите List ((1, «one»), (2, «two»), (3, «three»))

или из командной строки 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, не зная функционального программирования, я подумал, что это связано с форматом сжатия. Узнав больше о функциональном программировании, я стал им пользоваться все чаще и чаще.

20
ответ дан 26 November 2019 в 21:48
поделиться

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


>>> a = [1,2]
>>> b = [3,4]
>>> zip(a,b)
[(1,3),(2,4)]
7
ответ дан 26 November 2019 в 21:48
поделиться

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

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

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

[(1, "hello"); (2, "world")]
6
ответ дан 26 November 2019 в 21:48
поделиться

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

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))
10
ответ дан 26 November 2019 в 21:48
поделиться
Другие вопросы по тегам:

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