Во-первых, map, mapcat, filter и т. Д. Могут быть реализованы в терминах Reduce.Рассмотрим следующую наивную реализацию map для векторов (с более подробными именами для большей ясности):
(defn my-map [mapping-function collection]
(reduce
(fn [accumulator element]
(conj accumulator (mapping-function element)))
[]
collection))
(println (my-map (partial + 2) [1 2 3])) ; prints [3 4 5]
Грубый эквивалент для массивов Javascript, если вы пришли из фигурных скобок
function myMap(mappingFunction, collection) {
return collection.reduce(function(acc, element) {
acc.push(mappingFunction(element));
return acc;
}, []);
}
Насколько я могу судить, причина всего лишнего словоблудия в опубликованной вами версии заключается в том, что она полиморфна по отношению к различным типам коллекций и работает достаточно быстро, в то время как моя изящная маленькая версия работает только для векторов и работает медленно.Что касается ваших конкретных вопросов о коде:
(coll-reduce reducible (transformf f1) (f1))) ; what's the meaning of (f1) here?
Здесь f1
- это общая сокращающая функция.
Я не совсем понимаю, что здесь происходит и что происходит
Подумайте о том, что делает карта, определенная в терминах сокращения:
- Возьмите элемент из коллекции
- Выполните функцию наit
- Добавление измененного значения в новую коллекцию (обычно того же типа).
Здесь mapf
- это функция, которую мы используем для преобразования элементов коллекции, acc
- это аккумулятор: создание новой коллекции, а reducef
- функция сокращения, отвечающая за вывод результатов преобразования вместе с накопленной новой коллекцией и присоединение к ним.