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

Clojure 什么是zip(函数式编程?),clojure,functional-programming,zip,Clojure,Functional Programming,Zip,我最近看到了一些Clojure或Scala(对不起,我不熟悉它们),它们确实出现在了一个列表或类似的东西上。zip是什么?它从哪里来?zip是指当您获取两个输入序列,并生成一个输出序列,其中来自同一位置的输入序列的每两个元素都使用某种函数组合在一起。哈斯克尔的一个例子: 输入: zipWith (+) [1, 2, 3] [4, 5, 6] zip [1, 2, 3] [4, 5, 6] 输出: [5, 7, 9] [(1, 4), (2, 5), (3, 6)] 以上是一个更通用的定义

我最近看到了一些Clojure或Scala(对不起,我不熟悉它们),它们确实出现在了一个列表或类似的东西上。zip是什么?它从哪里来?

zip是指当您获取两个输入序列,并生成一个输出序列,其中来自同一位置的输入序列的每两个元素都使用某种函数组合在一起。哈斯克尔的一个例子:

输入:

zipWith (+) [1, 2, 3] [4, 5, 6]
zip [1, 2, 3] [4, 5, 6]
输出:

[5, 7, 9]
[(1, 4), (2, 5), (3, 6)]
以上是一个更通用的定义;有时,
zip
专门将元素组合为元组。例如,在哈斯克尔:

输入:

zipWith (+) [1, 2, 3] [4, 5, 6]
zip [1, 2, 3] [4, 5, 6]
输出:

[5, 7, 9]
[(1, 4), (2, 5), (3, 6)]
更通用的版本称为“zip with”。你可以把“zip”看作是“ZIPOP”的一个特例:


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

在这个特定的例子中,zip获取两个列表,并从这些列表中创建一个新的元组列表

例如,假设您有一个带有(1,2,3)的列表,另一个带有(“一”、“二”、“三”) 若你们把它们压缩在一起,你们会得到一个列表((1,“1”),(2,“2”),(3,“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中看到它时,在不了解函数式编程的情况下,我认为它与压缩格式有关。在我学习了更多关于函数式编程的知识之后,我越来越多地使用它。

Pavel的回答基本上描述了它。我只提供一个F#示例:

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

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

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


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

不幸的是,我没有足够的分数在最上面的答案上留下评论,但是

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

在scala中不等效。在scala中,你必须先做一个zip,然后做一个mapWell,这并不是真正的“不等价”,只是scala没有
zipWith
。显然,你可以这样做——用
zipWith
定义
zip
,或者用
zip
map
定义
zipWith
。如果用户使用Scala,你给他们Haskell,我很确定它不会编译,对吗?这就是我所说的等价物。很难说他在用什么,我的意思是“我最近看到了一些Clojure或Scala”并不确切:)使用zipWith的zip函数既丑陋又错误。传递给zipWith的函数是它的第一个参数。。。通常当您使用zip方法时,或者换句话说,在实际项目中,zip的典型用例是什么?