Để hiểu rõ hơn về mapcat tôi lấy một ví dụ:mapcat sử dụng bản đồ và concat
user> (mapcat #(list % %) [1 2 3])
(1 1 2 2 3 3)
Và cố gắng để tái tạo những gì doc mô tả sử dụng, mục đích, đồ và concat:
user> (doc mapcat)
clojure.core/mapcat
([f & colls])
Returns the result of applying concat to the result of applying map
to f and colls. Thus function f should return a collection.
Bằng cách này:
user> (concat (map #(list % %) [1 2 3]))
((1 1) (2 2) (3 3))
Tuy nhiên, bạn có thể thấy nó không hoạt động. Tuy nhiên tôi có thể sử dụng giảm như thế này nhưng không biết nếu đó là đúng:
user> (reduce #(concat %1 %2) (map #(vec (list % %)) [1 2 3]))
(1 1 2 2 3 3)
Các công trình trên nhưng tôi không biết nếu đó là một cách chính xác để tái tạo, sử dụng đồ và concat, những gì mapcat.
Về cơ bản, tôi muốn hiểu về Mapcat hoạt động dưới mui xe.
Điều gì đang xảy ra và làm cách nào tôi có thể truy cập nguồn của Mapcat? (Tôi đang sử dụng Emacs + nrepl)
Sử dụng 'apply' có lẽ tốt hơn' reduce' ở đây vì 'reduce' sẽ thực hiện' concat' cho mỗi cặp đối số.Vì 'concat' là lười, khi các giá trị thực sự bị ép buộc bạn có thể kết thúc với một ngăn xếp cuộc gọi sâu _really_, có thể dẫn đến tràn ngăn xếp. [Đây là một ví dụ đơn giản.] (Https://www.refheap.com/paste/6409) – DaoWen
Chỉ cần một mẹo - trong việc thực hiện của bạn với 'reduce', không cần phải quấn' concat' trong một hàm ẩn danh. Điều này cũng sẽ làm việc: '(giảm concat (map ...))' và là thích hợp hơn vì nó xử lý tốt hơn trường hợp của đầu vào rỗng. – Alex