W celu lepszego zrozumienia mapcat Wziąłem przykład:mapcat używając mapy i concat
user> (mapcat #(list % %) [1 2 3])
(1 1 2 2 3 3)
i starał się odtworzyć to, co doc opisuje stosując na celu mapę i 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.
Robiąc to:
user> (concat (map #(list % %) [1 2 3]))
((1 1) (2 2) (3 3))
Jednak jak widać, nie działa. Mogę jednak używać zmniejszyć tak, ale nie wiem, czy to jest poprawne:
user> (reduce #(concat %1 %2) (map #(vec (list % %)) [1 2 3]))
(1 1 2 2 3 3)
Powyższe działa, ale nie wiem, czy jest to prawidłowy sposób odtworzyć, używając mapę i concat, co mapcat robi.
Zasadniczo chciałbym zrozumieć mapcat działa pod maską.
Co się dzieje i jak mogę uzyskać dostęp do źródła mapcat? (Używam Emacsa + nrepl)
Użycie 'apply' jest prawdopodobnie lepsze niż' reduce', ponieważ 'reduce' spowoduje' concat' dla każdej pary argumentów.Ponieważ 'concat' jest leniwy, kiedy wartości są faktycznie wymuszane, możesz skończyć z stosem głębo- kich połączeń, prawdopodobnie powodując przepełnienie stosu. [Oto prosty przykład.] (Https://www.refheap.com/paste/6409) – DaoWen
Tylko wskazówka - w swojej implementacji z 'reduce', nie ma potrzeby owijać' concat' w anonimową funkcję. Będzie to również działać: '(redu concat (map ...))' i jest lepsze, ponieważ lepiej obsługuje przypadek pustych danych wejściowych. – Alex