2015-07-29 2 views
1

Я хотел бы применить функцию несколько раз к структуре данных и задавался вопросом, есть ли более простой способ.неоднократно применяют функцию к структуре данных

;; simple map and map-incrementing function 
(def a {:a 1}) 
(defn incmap [x] (update-in x [:a] inc)) 

;; best I could come up with 
(reduce (fn [m _] (incmap m)) a (range 10)) 

;; was hoping for something like this 
(repeatedly-apply incmap a 10) 
+0

Вы могли бы сделать что-то подобное с итерацией (например, '(nth (итерация incmap a) 10)', но я не понимаю ваш случай использования. Что именно вы пытаетесь достичь? –

+0

my usecase относится к популяционной генетике. У меня есть вектор (совокупность) карт (отдельных лиц) и некоторые функции, которые будут изменять значения в отдельных картах. Функция может установить флаг для индивида, чтобы умереть/мутировать ('inc' в этом вопросе.) Случайное число определит, сколько из этих изменений должно произойти в каждом раунде. Все мои функции возвращают модифицированный вектор популяции. Я хотел применить функцию «смерть» N раз к вектору моего населения. – zach

ответ

7

Вы ищете iterate:

(итерация FX)

Возвращает ленивую последовательность х (Fx), (е (Fx)) и т.д. е должен быть свободным побочных эффектов

Вам просто нужно взять п-й элемент:

(nth (iterate incmap a) 9) 

Использование продевал макрос:

(-> (iterate incmap a) 
    (nth 9)) 
+0

ах. очень хорошо. thanks @nberger – zach

+0

... так что вы можете определить функцию, на которую надеялись, как '(defn repeat-apply [f x n] (nth (iterate f x) n))'. – Thumbnail

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