... Có thể lập trình bắt buộc với dữ liệu có thể thay đổi được khoan sâu vào bộ não của tôi, nhưng tôi tìm thấy mã để xây dựng vectơ dữ liệu trong Clojure để tiết, khó sử dụng và phức tạp . Phải có cách tốt hơn!Cách tốt nhất để tích lũy kết quả trong một vector trong Clojure là gì? (Mã chức năng thuần túy có vẻ xấu xí và tiết)
Trong Ruby tôi có thể viết mã như:
results = []
a_collection.each do |x|
x.nested_collection.each do |y|
next if some_condition_holds
results << y
end
end
Trong Clojure, tôi không biết một cách tốt hơn để làm điều đó hơn là sử dụng một hàm đệ quy, có lẽ như sau (khủng khiếp) mã:
; NEWBIE ALERT! NEWBIE ALERT!
(loop [results []
remaining a_collection]
(if (empty? remaining)
results
(recur
(loop [results results
nested (nested_collection (first remaining))]
(if (empty? nested)
results
(if (some_condition_holds)
(recur results (rest nested))
(recur (conj results (first nested)) (rest nested)))))
(rest remaining))))
Nếu không có dữ liệu có thể thay đổi và lặp lặp lại, bạn cần sử dụng đệ quy để tạo bộ sưu tập. Mỗi hàm đệ quy như vậy cần một mệnh đề bảo vệ (empty?)
, v.v ... Toàn bộ điều này lặp đi lặp lại nó khiến tôi muốn hét lên.
Trong trường hợp đơn giản, map
là đủ, nhưng tôi đang nghĩ đến trường hợp có nhiều cấp độ lồng nhau và ở mỗi cấp, có thể có các điều kiện yêu cầu bỏ qua một lần lặp.
Trong Lisp thông thường, tôi có thể sử dụng macro loop
hoặc mapcan
. Clojure không có bất cứ điều gì như mapcan
?
THANKS CHO TẤT CẢ NGƯỜI BÀI ĐĂNG! ĐÁP ỨNG CỦA BẠN TẤT CẢ TUYỆT VỜI! Thật khó để chọn câu trả lời để chấp nhận. –
Nó đã được nói trước đây, nhưng cơ sở của lập trình chức năng là các chức năng soạn thảo và sử dụng các hàm bậc cao hơn, chứ không phải sử dụng đệ quy. Theo quy định, đệ quy chỉ nên được sử dụng nếu một giải pháp với HOFs sẽ phức tạp hơn so với một đệ quy sử dụng đệ quy. – NielsK
Để xây dựng: bạn sẽ sử dụng tấn đệ quy, nhưng hầu như tất cả nó phải được đệ quy mà người khác đã viết cho bạn, ví dụ như trong 'map' - nó khá hiếm khi viết đệ quy bằng tay. – amalloy