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

时间:2009-07-12 08:28:34

标签: clojure functional-programming zip

我最近看到了一些Clojure或Scala(抱歉我不熟悉它们),他们确实在列表或类似的东西上拉链。什么是拉链,它来自哪里?

5 个答案:

答案 0 :(得分:70)

Zip是指您输入两个输入序列,并产生一个输出序列,其中来自同一位置的输入序列的每两个元素使用某个函数组合。 Haskell中的一个例子:

输入:

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 

答案 1 :(得分:20)

zip是一种常见的函数式编程方法,如map或fold。您将在早期的lisps中找到这些函数,一直到ruby和python。它们旨在对列表执行常见的批处理操作。

在这种特殊情况下,zip会占用两个列表,并从这些列表中创建一个新的元组列表。

例如,假设您有一个列表(1,2,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中看到它时,在不知道函数式编程的情况下,我认为它与压缩格式有关。在我学习了更多关于函数式编程的知识后,我越来越多地使用它了。

答案 2 :(得分:10)

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))

答案 3 :(得分:7)

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


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

答案 4 :(得分:6)

帕维尔的回答几乎描述了它。我只是提供一个F#示例:

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

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

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