Идиома трансдукции над атомом?
Каков идиоматический способ применения преобразователей к значению атома?
Это, кажется, делает работу, но я не уверен в правильности (и стиле ^^).
(let [xf1 (map inc)
xf2 (map #(+ % 2))
xf #(vec (eduction (comp xf2 xf1) %))
a (atom [1 2 3])]
(swap! a xf))
;=> [4 5 6]
1 ответ
Решение
(let [xf1 (map inc)
xf2 (map #(* % 2))
foo #(into [] (comp xf2 xf1) %)
a (atom [1 2 3])]
(swap! a foo))
;; => [3 5 7]
Есть две вещи, которые нужно принять к сведению.
comp
В преобразователях работает в обратном порядке, как в обычных приложениях. То есть,xf2
применяется доxf1
, Для каждого элемента он удваивается, а затем увеличивается.eduction
возвращает последовательность, поэтому она не совпадает с вашим исходным значением в атоме.