Al fine di comprendere meglio mapcat ho preso un esempio:mapcat usando la mappa e concat
user> (mapcat #(list % %) [1 2 3])
(1 1 2 2 3 3)
E ha cercato di riprodurre ciò che il documento descrive l'uso, di proposito, mappa e 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.
In questo modo:
user> (concat (map #(list % %) [1 2 3]))
((1 1) (2 2) (3 3))
Tuttavia, come potete vedere, non funziona. Posso tuttavia usare ridurre come questo, ma non so se è corretto:
user> (reduce #(concat %1 %2) (map #(vec (list % %)) [1 2 3]))
(1 1 2 2 3 3)
Le opere di cui sopra, ma non so se è un modo corretto per ricreare, utilizzando mappa e concat, cosa mapcat fa.
Fondamentalmente mi piacerebbe capire di mapcat opere sotto il cofano.
Cosa sta succedendo e come posso accedere all'origine di mapcat? (Sto usando Emacs + nrepl)
Utilizzare 'apply' è probabilmente meglio di' reduce' qui perché 'reduce' farà un' concat' per ogni coppia di argomenti.Dato che 'concat' è pigro, quando i valori vengono effettivamente forzati si potrebbe finire con uno stack di chiamate _really_ deep, che potrebbe causare un overflow dello stack. [Ecco un semplice esempio.] (Https://www.refheap.com/paste/6409) – DaoWen
Solo un suggerimento: nella tua implementazione con 'reduce', non è necessario racchiudere' concat' in una funzione anonima. Funzionerà anche: '(riduci concat (map ...))' ed è preferibile perché gestisce meglio il caso dell'input vuoto. – Alex