Как удалить элемент из последовательности в Clojure?
Во-первых, я предполагаю, что каждая последовательность, специфичная для каждой структуры, будет иметь разные способы удаления элемента: векторы могут быть по индексу, список может быть удален первым или последним, Set должен быть передачей фактического элемента для удаления и т.д.
Во-вторых, я предполагаю, что есть некоторые методы для удаления, которые являются агностиками структуры; они работают на интерфейсе seq.
Так как последовательности неизменны в Clojure, я подозреваю, что вы на самом деле делаете дешевую копию оригинала, только без оригинального элемента. Это означает, что для удаления может быть использовано понимание списка, но я подозреваю, что это было бы излишне подробным.
Просьба дать некоторые идиоматические примеры различных способов удаления элементов из Clojure последовательностей.
Ответы
Ответ 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])
Ответ 2
Посмотрите Clojure ссылку для последовательностей. filter
и remove
- это то, что вы ищете.
Ответ 3
Как продолжение ответа Брайана Карпера. Это зависит от того, что вы будете делать с результатом. Если вы передаете результат тому, что хочет работать со всем набором данных (т.е. Для его печати). Идиоматично делать seq и использовать фильтр или удалять, чтобы решить проблему лениво. Если, с другой стороны, вы изменяете структуру данных для сохранения для различных последующих применений, тогда создание seq на ней потеряет ее благоприятные характеристики обновления, поэтому в этом случае лучше использовать функцию обновления, специфичную для этой структуры данных.