Подтвердить что ты не робот

Как удалить элемент из последовательности в Clojure?

Во-первых, я предполагаю, что каждая последовательность, специфичная для каждой структуры, будет иметь разные способы удаления элемента: векторы могут быть по индексу, список может быть удален первым или последним, Set должен быть передачей фактического элемента для удаления и т.д.

Во-вторых, я предполагаю, что есть некоторые методы для удаления, которые являются агностиками структуры; они работают на интерфейсе seq.

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

Просьба дать некоторые идиоматические примеры различных способов удаления элементов из Clojure последовательностей.

4b9b3361

Ответ 1

Нет единого интерфейса для удаления вещей из всех типов структуры данных Clojure, возможно, из-за разных характеристик производительности.

(disj #{:foo :bar} :foo)       ; => #{:bar}
(dissoc {:foo 1 :bar 2} :foo)  ; => {:bar 2}
(pop [:bar :foo])              ; => [:bar]
(pop (list :foo :bar))         ; => (:bar)

Они также работают (возвращая seq):

(remove #{:foo} #{:foo :bar})      ; => (:bar)
(remove #{:foo} [:foo :bar])       ; => (:bar)
(remove #{:foo} (list :foo :bar))  ; => (:bar)

Это не работает для хэш-карт, потому что когда вы перебираете карту, вы получаете пары ключ/значение. Но это работает:

(remove (fn [[k v]] (#{:foo} k)) {:foo 1 :bar 2})  ; => ([:bar 2])

Ответ 3

Как продолжение ответа Брайана Карпера. Это зависит от того, что вы будете делать с результатом. Если вы передаете результат тому, что хочет работать со всем набором данных (т.е. Для его печати). Идиоматично делать seq и использовать фильтр или удалять, чтобы решить проблему лениво. Если, с другой стороны, вы изменяете структуру данных для сохранения для различных последующих применений, тогда создание seq на ней потеряет ее благоприятные характеристики обновления, поэтому в этом случае лучше использовать функцию обновления, специфичную для этой структуры данных.