карта фильтра clojure по ключам - PullRequest
9 голосов
/ 26 августа 2011

Я следую этому примеру: http://groups.google.com/group/clojure/browse_thread/thread/99b3d792b1d34b56

(см. Последний ответ)

И это таинственная ошибка, которую я получаю:

Clojure 1.2.1
user=> (def m {:a "x" :b "y" :c "z" :d "w"})
#'user/m
user=> (filter #(some % [:a :b]) m)
java.lang.IllegalArgumentException: Key must be integer
(user=>

Также я не понимаю, почему это будет работать. Не собирается ли (некоторые ...) возвращать первое совпадающее значение, "x", каждый раз? Я полный нуб в clojure и просто пытаюсь учиться.

Пожалуйста, просветите меня.

Ответы [ 3 ]

28 голосов
/ 26 августа 2011

Полагаю, мне просто нужно было больше читать документы:

(select-keys m [:a :b])

Хотя я все еще не уверен, каково было намерение с примером, который я нашел ...

8 голосов
/ 27 августа 2011

Если вы «перебираете» карту, вы получите пары ключ-значение, а не ключи.Например,

   user=> (map #(str %) {:a 1, :b 2, :c 3})
   ("[:a 1]" "[:b 2]" "[:c 3]")

Таким образом, ваша анонимная функция пытается оценить (some [:a "x"] [:a :b]), что явно не работает.

Идеологическим решением является использование select-keys, как указано в другом ответе.

1 голос
/ 26 августа 2011
(filter 
  (fn [x] 
    (some #{(key x)} [:a :b])) m)

Сделал бы то же самое, используя filter и some (но уродливее и медленнее).

Это работает по фильтру всех из m, если какое-то [:a :b] находится в наборе #{(key x)} (то есть с использованием набора в качестве предиката), а затем возвращает запись карты.

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