为了更好地理解mapcat,我举了一个例子:
user> (mapcat #(list % %) [1 2 3])
(1 1 2 2 3 3)
并试图重现文档描述的内容,故意使用map和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.
通过做这个:
user> (concat (map #(list % %) [1 2 3]))
((1 1) (2 2) (3 3))
但是,如您所见,它不起作用。但是,我可以像这样使用 reduce,但不知道它是否正确:
user> (reduce #(concat %1 %2) (map #(vec (list % %)) [1 2 3]))
(1 1 2 2 3 3)
以上方法有效,但我不知道这是否是使用map和concat重新创建 mapcat的正确方法。
基本上我想了解mapcat的工作原理。
发生了什么,如何访问mapcat的源代码?(我正在使用 Emacs + nrepl)