2015-10-09 3 views
0

Что такое идиоматический способ применения преобразователей к значению атома?Идиома для трансдукции над атомом?

Это, похоже, выполняет эту работу, но я не уверен в правильности (и стиле ^^).

(let [xf1 (map inc) 
     xf2 (map #(+ % 2)) 
     xf #(vec (eduction (comp xf2 xf1) %)) 
     a (atom [1 2 3])] 
    (swap! a xf)) 
;=> [4 5 6] 

ответ

2
(let [xf1 (map inc) 
     xf2 (map #(* % 2)) 
     foo #(into [] (comp xf2 xf1) %) 
     a (atom [1 2 3])] 
    (swap! a foo)) 
;; => [3 5 7] 

Есть две вещи, которые нужно принять к сведению.

  1. comp В преобразователях работает обратный порядок как нормальное применение. То есть xf2 применяется до xf1. Для каждого элемента он удваивается, а затем увеличивается.
  2. eduction возвращает последовательность, поэтому это не тот же тип, что и исходное значение в атоме.
+0

Зачем делать 'foo' функцию для' swap! ', А не просто значение для' (reset! A foo) '? Что касается 2. Я был ленив, редактируя, чтобы получить вектор. Относительно 1. Я знал об этом, следовательно, «обратный» порядок в comp. Редактирование для идиоматического '(map inc)', thx. –

+0

Хороший вопрос. В этом случае «swap!» Действительно не отличается от «reset!» С указанными значениями, поскольку атом создается локально и никогда не используется снаружи. Однако атомы предназначены для использования в нескольких потоках, поэтому было бы более идиоматично вставлять логику чтения-вывода в STM. Таким образом, два вызова из разных потоков всегда будут превращать атом дважды. Если чтение является внешней транзакцией, возможно, что результат будет преобразован только один раз. – Davyzhu

Смежные вопросы