У меня есть функция, которая создает ленивые последовательности, называемые a-функцией.
Если я запустил код:
(map a-function a-sequence-of-values)
он возвращает ленивую последовательность, как ожидалось.
Но когда я запускаю код:
(mapcat a-function a-sequence-of-values)
это ломает ленивость моей функции. На самом деле он превращает этот код в
(apply concat (map a-function a-sequence-of-values))
Таким образом, он должен реализовать все значения с карты, прежде чем конкатенировать эти значения.
Мне нужна функция, которая связывает результат функции карты по требованию, не предварительно запустив всю карту.
Я могу взломать функцию для этого:
(defn my-mapcat
[f coll]
(lazy-seq
(if (not-empty coll)
(concat
(f (first coll))
(my-mapcat f (rest coll))))))
Но я не могу поверить, что clojure уже ничего не сделал. Знаете ли вы, имеет ли clojure такую функцию? Лишь у нескольких человек и у меня такая же проблема?
Я также нашел блог, который занимается одной и той же проблемой: http://clojurian.blogspot.com.br/2012/11/beware-of-mapcat.html