簡體   English   中英

什么是zip(函數式編程?)

[英]What is zip (functional programming?)

我最近看到了一些Clojure或Scala(對不起,我不熟悉它們),他們確實在列表或類似的東西上拉鏈。 什么是拉鏈,它來自哪里?

Zip是在您輸入兩個輸入序列時產生的輸出序列,其中使用某個函數組合來自相同位置的輸入序列的每兩個元素。 Haskell中的一個例子:

輸入:

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

輸出:

[5, 7, 9]

以上是一個更通用的定義; 有時, zip特指將元素組合為元組。 例如在Haskell再次:

輸入:

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 

zip是一種常見的函數式編程方法,如map或fold。 您將在早期的lisps中找到這些函數,一直到ruby和python。 它們旨在對列表執行常見的批處理操作。

在這種特殊情況下,zip需要兩個列表,並從這些列表中創建一個新的元組列表。

例如,假設您有一個列表(1,2,3)和另一個列表(“一個”,“兩個”,“三個”)如果您將它們壓縮在一起,您將得到List((1,“one”) ),(2,“兩個”),(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中看到它而不知道函數式編程時,我認為它與壓縮格式有關。 在我學習了更多關於函數式編程的知識之后,我越來越多地使用它了。

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

您可以在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 x y

z的值將是包含兩個序列中相同位置的項元組的序列:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM