Я думаю, что короткий ответ заключается в том, что функция, переданная для обновления, позволяет обновлять значения за один шаг, а не за 3 (поиск, вычисление нового значения, установка).
По совпадению, только сегодня ястолкнулся с этим использованием обновления в презентации Clojure Говарда Льюиса Шипа:
(def in-str "this is this")
(reduce
(fn [m k] (update-in m [k] #(inc (or % 0))))
{}
(seq in-str))
==> {\space 2, \s 3, \i 3, \h 2, \t 2}
Каждый вызов обновления принимает букву в качестве ключа, ищет ее на карте и, если она найденатам увеличивается счетчик букв (в противном случае устанавливается значение 1).Reduce управляет процессом, начиная с пустой карты {}, и неоднократно применяет обновление с последовательными символами из входной строки.Результатом является карта частот букв.Slick.
Примечание 1: clojure.core / частоты похожа, но использует ассоциацию!вместо обновления.
Примечание 2: Вы можете заменить # (inc (или% 0)) на (fnil inc 0).Отсюда: ФНИЛ