Идиоматический закрытый вопрос о преобразовании последовательности - PullRequest
5 голосов
/ 31 января 2011

Я изучаю Clojure, и мне нужно двигаться в правильном направлении с этой проблемой, с которой я столкнулся.

У меня есть последовательность событий. Каждое событие включает в себя «дату».

(def events
  [
   [1509 :marry   "Catherine of Aragon"]
   [1527 :unmarry "Catherine of Aragon"]
   [1533 :marry   "Anne Boleyn"]
   [1536 :unmarry "Anne Boleyn"]
   [1536 :marry   "Jane Seymour"]
   [1537 :unmarry "Jane Seymour"]
   [1540 :marry   "Anne of Cleves"]
   [1540 :unmarry "Anne of Cleves"]
   [1540 :marry   "Catherine Howard"]
   [1542 :unmarry "Catherine Howard"]
   [1543 :marry   "Catherine Parr"]])

Я хочу преобразовать это в ленивую временную шкалу, то есть последовательность, содержащую один вектор в год. Начиная с года первого события и продолжая до бесконечности.

[[[:marry "Catherine of Aragon"]] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [[:unmarry "Catherine of Aragon"]] [] [] [] [] [] [[:marry "Ane Boleyn"]] [] [] [[:unmarry "Anne Boleyn"] [:marry "Jayne Seymour"]] ...]

Ответы [ 2 ]

8 голосов
/ 31 января 2011
(def timeline
  (let [events-by-year (group-by first events)]
    (map #(map next (events-by-year %))
      (iterate inc (reduce min (keys events-by-year))))))

Быстрый тест:

=> (take 30 timeline)
(((:marry "Catherine of Aragon")) () () () () () () () () () () () () () () () ()
 () ((:unmarry "Catherine of Aragon")) () () () () () ((:marry "Anne Boleyn")) ()
 () ((:unmarry "Anne Boleyn") (:marry "Jane Seymour")) ((:unmarry "Jane Seymour"))
 ())
3 голосов
/ 31 января 2011

Я бы предложил что-то вроде:

(defn timeline
  ([] (timeline (ffirst *events*) *events*))
  ([time evts]
     (let [[now later] (split-with #(= time (first %)) evts)]
       (cons (map rest now)
             (lazy-seq (timeline (inc time) later))))))

Тест:

user> (take 30 (timeline))
(((:marry "Catherine of Aragon")) () () () () () () () () () () () () () () () () () 
 ((:unmarry "Catherine of Aragon")) () () () () () ((:marry "Anne Boleyn")) () () 
 ((:unmarry "Anne Boleyn") (:marry "Jane Seymour")) ((:unmarry "Jane Seymour")) ()) 

Я предполагаю, что список событий также бесконечен:)

Обновлен с улучшениями и заимствовал пару идей из cgrand (спасибо:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...