Поиск позиции объекта в последовательности в Clojure - PullRequest
2 голосов
/ 01 января 2012

По сути, я хочу функцию, которая работает следующим образом:

user=> (pos 'c '(a b c d e f g) =)
2
user=> (pos 'z '(a b c d e f g) =)
nil

И я придумал это:

(defn pos
  "Gets position of first object in a sequence that satisfies match"
  [object sequence match]
  (loop [aseq sequence position 0]
    (cond (match object (first aseq)) position
          (empty? aseq) nil
          :else (recur (rest aseq) (inc position)))))

Так что мой вопрос, есть ли какие-то встроенныефункция, которая позволила бы нам сделать это, или был бы лучший, более функциональный / Clojure-ish способ написать функцию pos?

1 Ответ

5 голосов
/ 01 января 2012

Ну, если вы действительно хотите найти конкретный предмет, вы можете использовать .indexOf в коллекции; если вы хотите сделать что-то более общее с предикатами, вам не нужна функция и элемент, достаточно просто функции.

(defn pos [pred coll]
  (->> coll
       (map-indexed #(when (pred %2) %1))
       (remove nil?)
       (first)))

user> (pos #{'c} '(a b c d e f g))
2

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

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