2013-04-30 22 views

Trả lời

9

Đọc tài liệu của apply:

user=> (doc apply) 
------------------------- 
clojure.core/apply 
([f args] [f x args] [f x y args] [f x y z args] [f a b c d & args]) 
    Applies fn f to the argument list formed by prepending intervening arguments to args. 
nil 

Vì vậy, (apply map vector (vec jpgList)) tương ứng với f x args, vì vậy map sẽ được áp dụng cho các chức năng vector, tiếp theo là các yếu tố của (vec jpgList). Không giống như Haskell, map của Clojure hỗ trợ nhiều bộ sưu tập để hoạt động. (vec jpgList) có lẽ là một vector lồng nhau, hoặc danh sách, như trong ví dụ sau:

user=> (apply map vector [[1 2 3] [4 5 6]]) 
([1 4] [2 5] [3 6]) 

gì đã xảy ra là, mọi yếu tố sản xuất bởi map là vector của mỗi phần tử thứ n của các phần tử của vector lồng nhau. Hàm này còn được gọi là transpose trong các phép toán ma trận.

5

apply chấp nhận hàm và đối số của hàm. Nếu được gọi với nhiều hơn hai đối số, các đối số ở giữa sẽ được thêm vào như các đối số vô hướng (như sử dụng một phần). Xem the documentation for apply

Nói cách khác, tất cả bốn trong số này là như nhau:

(apply (partial map vector) [[1 2 3 4] "abcd"]) 
(apply map [vector [1 2 3 4] "abcd"]) 
(apply map vector [[1 2 3 4] "abcd"]) 
(map vector [1 2 3 4] "a b c d") 

Tất cả sẽ trở lại ([1 \a] [2 \b] [3 \c] [4 \d]).

2

Chỉ map đang được 'áp dụng'. Tuy nhiên, đối số đầu tiên cho map luôn là một hàm. Trong trường hợp này, vector đang được thêm vào chuỗi các đối số được tạo bởi (vec jpgList). vector ở đây không phải là một hàm thứ hai được áp dụng, nó là đối số đầu tiên trong chuỗi mà map được áp dụng cùng với phần còn lại.

Bạn sẽ thấy thành ngữ này thường khi áp dụng bất kỳ hàm bậc cao hơn nào mà chính nó có chức năng làm đối số.

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