функция карты clojure стремится? - PullRequest
6 голосов
/ 28 февраля 2011

Согласно удивительной учебной странице Марка, «функция карты применяет данную функцию, которая принимает один параметр для каждого элемента в коллекции, возвращая ленивую последовательность результатов».

Тем не менее, когда я делаю следующее:

(def input-message-list (range 100 126))

(defn test-123 [in]
  (println "doing " in)
  (str "out " in))

(def output-test (map
                   test-123
                   input-message-list))

(first output-test)

, в REPL я получаю побочные эффекты println для всего диапазона, а не только для первого элемента!

Что здесь происходит, люди?

Ответы [ 2 ]

7 голосов
/ 28 февраля 2011

Уже ответили в здесь :

, так как на самом деле 32 элемента оцениваются одновременно

Ваш диапазон содержит менее 32 элементов.

3 голосов
/ 28 февраля 2011

Это часть чанкованных последовательностей, которая действительно помогает исполнению паттерна «map over lazy seq», столь распространенного в Clojure. Таким образом, ваша функция отображения получает намного больше последовательных вызовов и намного быстрее попадает в быстрый путь компилятора точки доступа JVM. Когда Рич продемонстрировал это в Сан-Франциско в 2008 году, было удивительно видеть, как эти два фрагмента кода работают с одинаковой скоростью:

(reduce + (map inc (range 10000)))

и

(loop [i 0 sum 0]
   (recur (inc i) (+ sum i)))

Теперь вы можете написать идоматический clojure и получить полную скорость. если это станет проблемой, вы можете отключить здесь

...