¿Qué es zip (progtwigción funcional?)

Recientemente vi algunos Clojure o Scala (lo siento, no estoy familiarizado con ellos) y lo hicieron zip en una lista o algo así. ¿Qué es zip y de dónde vino?

Zip es cuando toma dos secuencias de entrada y produce una secuencia de salida en la que cada dos elementos de secuencias de entrada en la misma posición se combinan utilizando alguna función. Un ejemplo en Haskell:

Entrada:

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

Salida:

 [5, 7, 9] 

Lo anterior es una definición más genérica; a veces, zip se refiere específicamente a la combinación de elementos como tuplas. Por ejemplo, en Haskell nuevamente:

Entrada:

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

Salida:

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

Y la versión más genérica se llama “zip con”. Puede considerar “zip” como un caso especial de “zipWith”:

 zip xs ys = zipWith (\xy -> (xs, ys)) xs ys 

zip es un método de progtwigción funcional común como map o fold. Encontrarás estas funciones en los ceceos iniciales hasta ruby ​​y python. Están diseñados para realizar operaciones batch comunes en las listas.

En este caso particular, zip toma dos listas y crea una nueva lista de tuplas de esas listas.

por ejemplo, supongamos que tiene una lista con (1,2,3) y otra con (“uno”, “dos”, “tres”). Si los comprime juntos, obtendrá la Lista ((1, “uno”) ), (2, “dos”), (3, “tres”))

o desde la línea de comando de scala, obtendrías:

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

Cuando lo vi por primera vez en Python, sin conocer la progtwigción funcional, pensé que estaba relacionado con el formato de compresión. Después de que aprendí más sobre progtwigción funcional, la he usado más y más.

Desafortunadamente, no tengo suficientes puntos para dejar un comentario en la respuesta principal, pero

 zip xs ys = zipWith xs ys (\xy -> (xs, ys)) 

está mal , debería ser:

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

o simplemente:

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

Puede usar el siguiente código en Python:

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

La respuesta de Pavel lo describe bastante. Solo proporcionaré un ejemplo de F #:

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

El valor de z será una secuencia que contiene tuplas de elementos en la misma posición de las dos secuencias:

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