2009-07-12 75 views
41

Gần đây tôi đã thấy một số Clojure hoặc Scala (xin lỗi tôi không quen thuộc với họ) và họ đã zip trên một danh sách hoặc một cái gì đó như thế. Mã zip là gì và nó đến từ đâu?Zip (lập trình chức năng là gì?)

Trả lời

70

Zip là khi bạn thực hiện hai chuỗi đầu vào và tạo chuỗi đầu ra trong đó mỗi phần tử từ chuỗi đầu vào ở cùng một vị trí được kết hợp bằng một số hàm. Một ví dụ trong Haskell:

Input:

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

Output:

[5, 7, 9] 

Trên đây là một định nghĩa chung chung hơn; đôi khi, zip đề cập cụ thể đến việc kết hợp các yếu tố như bộ dữ liệu. Ví dụ. trong Haskell một lần nữa:

Input:

zip [1, 2, 3] [4, 5, 6] 

Output:

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

Và phiên bản chung chung hơn được gọi là "zip với". Bạn có thể coi "zip" là trường hợp đặc biệt của "zipWith":

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

không tương đương trong scala. Trong scala bạn sẽ phải làm một zip, sau đó một bản đồ – drudru

+1

Cảm ơn bây giờ tôi đã nhận nó cristal rõ ràng! –

+1

Sau đó, nó không thực sự "không tương đương", nó chỉ là Scala không có 'zipWith'. Rõ ràng, bạn có thể làm một trong hai - xác định 'zip' trong điều khoản của' zipWith', hoặc xác định 'zipWith' trong điều khoản của' zip' và 'map'. –

19

zip là phương pháp lập trình hàm phổ biến như bản đồ hoặc gấp. Bạn sẽ tìm thấy các chức năng này trong lisps đầu tất cả các con đường lên đến ruby ​​và python. Chúng được thiết kế để thực hiện các thao tác lô phổ biến trên danh sách.

Trong trường hợp cụ thể này, zip có hai danh sách và tạo danh sách các bộ dữ liệu mới từ các danh sách đó. Ví dụ:

ví dụ: cho phép bạn có danh sách (1,2,3) và một danh sách khác ("một", "hai", "ba") Nếu bạn nén chúng lại với nhau, bạn sẽ nhận được Danh sách ((1, "một"), (2, "hai"), (3, "ba"))

hoặc từ dòng lệnh scala, bạn sẽ nhận được:

scala> List(1,2,3).zip(List("one","two","three")) 
res2: List[(Int, java.lang.String)] = List((1,one), (2,two), (3,three)) 

Khi tôi lần đầu tiên nhìn thấy nó trong Python, mà không biết lập trình hàm, tôi nghĩ nó có liên quan đến định dạng nén. Sau khi tôi đã tìm hiểu thêm về lập trình hàm, tôi đã sử dụng nó nhiều hơn và nhiều hơn nữa.

+1

Thông thường khi nào bạn sử dụng phương thức zip hoặc nói cách khác, trường hợp sử dụng điển hình cho zip trong thực tế là gì dự án? –

6

Câu trả lời của Pavel mô tả khá nhiều.Tôi sẽ chỉ cung cấp một F # ví dụ:

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

Giá trị của z sẽ là một chuỗi chứa các bộ của các mục trong vị trí tương đương từ hai chuỗi:

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

Bạn có thể sử dụng đoạn mã sau bằng Python:


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

Unfortunatley tôi không có đủ điểm để thậm chí để lại nhận xét về câu trả lời hàng đầu, nhưng

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

sai, nó phải là:

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

hoặc đơn giản là:

zip = zipWith (\x y -> (x,y)) 
+2

'zip = zipVới (,)' –

Các vấn đề liên quan