Как разделение на идентичность дедуплицирует коллекции в clojure? - PullRequest
1 голос
/ 23 сентября 2019

Следующие замкнутые коды дедуплицируют элементы в векторе:

user> (partition-by identity [1 2 2 3 3 3 4 2 2 1 1 1])
((1) (2 2) (3 3 3) (4) (2 2) (1 1 1))
  1. Как это происходит для дедупликации?
  2. Как можно шаг за шагом увидеть, как получаетсяКоллекция построена?

1 Ответ

1 голос
/ 23 сентября 2019

Если вы еще не видели его, обязательно добавьте в закладки The Clojure CheatSheet .

Нажав на partition-by , вы получите ClojureDocs.org с хорошей информацией и примерами.

Нажмите в верхнем правом углу, чтобы увидеть исходный код Clojure .Посмотрите на 2-ую арность, которая принимает функцию f и коллекцию coll:

 ([f coll]
     (lazy-seq
      (when-let [s (seq coll)]
        (let [fst (first s)
              fv (f fst)
              run (cons fst (take-while #(= fv (f %)) (next s)))]
          (cons run (partition-by f (seq (drop (count run) s))))))))

Итак, fst - первый элемент в коллекции, а fv - преобразованное значение с использованиемфункция f.Затем он потребляет все элементы, которые соответствуют fv, после чего он возвращается с первым несовпадающим элементом.

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