什么是zip(函数式编程?)

我最近看到一些Clojure或Scala(对不起,我不熟悉它们),他们做了一个列表或类似的东西。 什么是拉链,它是从哪里来的?

Zip是当你input两个input序列,并产生一个输出序列,其中来自同一位置的input序列中的每两个元素都使用某个函数进行组合。 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 (\xy -> (xs, ys)) xs ys 

zip是一种常见的function性编程方法,如地图或折叠。 你会发现这些函数在早期的Lisp一直到ruby和python。 它们被devise为在列表上执行常见的批处理操作。

在这种特殊情况下,zip需要两个列表,并从这些列表中创build一个新的元组列表。

例如,假设你有一个带有(1,2,3)和另一个带有(“one”,“two”,“3”)的列表。如果你把它们压在一起,你会得到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中看到它,而不知道函数式编程时,我认为它与压缩格式有关。 在我学习了更多关于函数式编程之后,我已经越来越多地使用它了。

Unfortunatley我没有足够的分数,甚至留下评论的最佳答案,但

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

错的 ,应该是:

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

或者干脆:

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

您可以在Python中使用以下代码:

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

帕维尔的回答很好地描述了它。 我将只提供一个F#示例:

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

z的值将是一个包含两个序列中相同位置项目元组的序列:

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