Khi sử dụng chức năng đơn giản như +, thực sự bạn không sử dụng chức năng nào.
Nói chung, ý tưởng là giảm là một hoạt động tích lũy. Bạn trình bày giá trị tích lũy hiện tại và một giá trị mới cho hàm tích lũy của bạn, với kết quả là giá trị cộng dồn cho lần lặp tiếp theo. Vì vậy, lặp đi lặp lại của bạn trông giống như:
cum-val[i+1] = F(cum-val[i], input-val[i]) ; please forgive the java-like syntax!
Đối với áp dụng, ý tưởng là bạn đang cố gắng để gọi một chức năng hy vọng một số lập luận vô hướng, nhưng họ hiện đang ở trong một bộ sưu tập và cần phải được kéo ra. Vì vậy, thay vì nói:
vals = [ val1 val2 val3 ]
(some-fn (vals 0) (vals 1) (vals2))
chúng ta có thể nói:
(apply some-fn vals)
và nó được chuyển thành tương đương với:
(some-fn val1 val2 val3)
Vì vậy, sử dụng "áp dụng" giống như "loại bỏ các dấu ngoặc đơn "xung quanh chuỗi.
Nguồn
2014-07-12 06:31:52
Câu trả lời hay. Một lưu ý phụ, tại sao không bao gồm một hàm 'sum' tích hợp như trong haskell? Có vẻ như một hoạt động khá phổ biến. – dbyrne
Cảm ơn, rất vui khi được nghe điều đó! Re: 'sum', tôi muốn nói rằng Clojure có hàm này, nó được gọi là' + 'và bạn có thể sử dụng nó với' apply'. :-) Nghiêm túc nói, tôi nghĩ rằng trong Lisp, nói chung, nếu một hàm variadic được cung cấp, nó không thường đi kèm với một wrapper hoạt động trên bộ sưu tập - đó là những gì bạn sử dụng 'apply' cho (hoặc' reduce', nếu bạn biết Điều đó có ý nghĩa hơn). –
Vui, lời khuyên của tôi là ngược lại: 'giảm bớt' khi nghi ngờ, 'áp dụng' khi bạn biết chắc chắn có tối ưu hóa. Hợp đồng 'reduce' là chính xác hơn và do đó dễ bị tối ưu hóa chung hơn. 'apply' là mơ hồ hơn và do đó chỉ có thể được tối ưu hóa theo từng trường hợp. 'str' và' concat' là hai excepton phổ biến. – cgrand