什么是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")]