2012-10-07 31 views
6

Tôi đang làm việc cách của mình thông qua labrepl và tôi thấy một số mã sau mô hình này:clojure: (áp dụng fn coll) vs (áp dụng # (áp dụng fn% &) coll)

;; Pattern 
(apply #(apply f %&) coll) 

;; Concrete example 
user=> (apply #(apply + %&) [1 2 3 4]) 
10 

này có vẻ là tương đương với mẫu này:

;; Pattern 
(apply f coll) 

;; Concrete example 
user=> (apply + [1 2 3 4]) 
10 

Các mẫu này có tương đương không? Nếu không, sự khác biệt là gì và khi nào bạn sẽ sử dụng cái kia?

Tôi đã lấy mẫu cũ từ step function trong phòng thí nghiệm di động-automata của labrepl:

(defn step 
    "Advance the automation by one step, updating all cells." 
    [board] 
    (doall 
    (map (fn [window] 
      (apply #(apply map brians-brain-rules %&) 
       (doall (map torus-window window)))) 
     (torus-window board)))) 

Cập nhật: Tôi đã thêm một ví dụ cụ thể của mỗi mô hình để giúp làm cho câu hỏi rõ ràng hơn.

Trả lời

4

Không, không có sự khác biệt. Không có lý do gì để viết biểu mẫu dài hơn; Tôi chỉ có thể giả định rằng nó đã được thay đổi dần dần đối với mã có ý nghĩa tại một thời điểm.

+0

Đồng ý. Tôi nghĩ có lẽ tham số có thể tạo ra sự khác biệt, nhưng '(áp dụng # (áp dụng (fn [c] (bản đồ + c [1 1 1]))% &) [[-1 -1 -1]])' và ' (áp dụng (fn [c] (bản đồ + c [1 1 1])) [[-1 -1 -1]]) 'là tương đương. – noahlz

0

Về cơ bản, cả hai biểu mẫu đều hoàn thành cùng một điều và ít nhiều giống nhau. Mỗi cung cấp một cách để giới thiệu một hàm ẩn danh.

Sử dụng #(... là viết tắt của trình đọc Clojure cho chức năng ẩn danh. Nó tương đương với (fn [arg1 & args]..., nhưng bạn không thể nhúng một hàm #(... ẩn danh vào nhau và đối số được biểu thị dưới dạng % %2... hoặc %1 %2... thay vì gắn với vectơ (fn [arg & args].

Cả hai đều là các phương thức để thể hiện chức năng ẩn danh. #(... được sử dụng cho các chức năng đơn giản hơn, và (fn... được sử dụng cho các chức năng chi tiết hơn.

#(... có xu hướng làm mọi thứ trông hơi lạ.

+1

Không ... tại sao hai ứng dụng lại hoạt động? – noahlz

+0

Câu hỏi của tôi không phải về các cú pháp khác nhau cho các chức năng ẩn danh. Tôi đã thêm các ví dụ vào câu hỏi của mình để làm cho nó rõ ràng hơn. – rigdern

+0

@rigdern sử dụng 'fn' để đại diện cho bất kỳ funcion nào là gây hiểu lầm, tôi đã chỉnh sửa câu hỏi – soulcheck

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