Кажется, я должен упустить какую-то очевидную часто используемую идиому, но отсутствие этих двух функций кажется мне немного озадачивающим. Существует some, но он возвращает nil вместо False, почему бы не использовать функцию any??
Почему Clojure нет? или любой-пред? функционировать?
Ответ 1
some считается таким же, как any?, если бы он существовал. существует тесная функция not-any?, которая просто вызывает some под капотом:
(source not-any?)
(def
...
not-any? (comp not some))
вы могли бы просто написать любой как:
(def any? (comp boolean some))
патчи приветствовали:) просто заполните и отправьте письмо в соглашении с автором.
Ваша точка зрения на именование особенно актуальна, поскольку функция not-any? была включена с 1.0
(defn any? [pred col] (not (not-any? pred col)))
(any? even? [1 2 3])
true
(any? even? [1 3])
false
Думаю, никто не дошел до отправки патча? (подсказка hint hud nudge)
При использовании любого кода, основанного на some (not-any? вызывает некоторые под капотом), будьте осторожны, чтобы соответствовать типам pred и col или использовать pred, который улавливает исключения типа
(if (some odd? [2 2 nil 3]) 1 2)
No message.
[Thrown class java.lang.NullPointerException]
ps: этот пример из clojure 1.2.1
Ответ 2
nil оценивается как false. (if nil 1 2) имеет значение 2.
some возвращает первый элемент, который удовлетворяет предикату. Все, что не соответствует nil или false, равно true. Итак, (if (some odd? [2 2 3]) 1 2) оценивается в 1.
Ответ 3
Вы ищете some-fn, хотя вам нужно будет вывести возвращаемое значение предиката, который он генерирует через boolean.
user> (doc every-pred)
-------------------------
clojure.core/every-pred
([p] [p1 p2] [p1 p2 p3] [p1 p2 p3 & ps])
Takes a set of predicates and returns a function f that returns true if all of its
composing predicates return a logical true value against all of its arguments, else it returns
false. Note that f is short-circuiting in that it will stop execution on the first
argument that triggers a logical false result against the original predicates.
nil
user> (doc some-fn)
-------------------------
clojure.core/some-fn
([p] [p1 p2] [p1 p2 p3] [p1 p2 p3 & ps])
Takes a set of predicates and returns a function f that returns the first logical true value
returned by one of its composing predicates against any of its arguments, else it returns
logical false. Note that f is short-circuiting in that it will stop execution on the first
argument that triggers a logical true result against the original predicates.
nil
Эти функции аналогичны аналогично тем, что every? и some аналогичны.
Ответ 4
Кажется, они обращаются к "любому". В вопросе также упоминается "любая пред". Как насчет этого?
(defn any-pred [preds]
(comp not (apply every-pred (map #(comp not %) preds))))
Это принимает коллекцию, а не несколько аргументов, но изменить это было бы достаточно просто.
Пример:
=> (def p (any-pred [(partial = "a") (partial = "b")]))
=> (p "a") true
=> (p "b") true
=> (p "c") false
Ответ 5
Это изменилось с выпуском Clojure 1.9, который добавляет any? функция, которая возвращает истину на любом входе.
Определение просто (defn any? [x] true), и коммит, добавляющий его, - 0929d1.
Re: some, any? not-any? every? not-every?
Заметьте что это any? разве это не отрицание not-any? Как вы могли ожидать, основываясь на том, как every? и not-every? реализованы, но совершенно новая функция. Если вы ищете отрицание (не отрицание?) not-any? , то функция для использования еще some.
Ответ 6
Вы можете определить any-pred следующим образом:
(defn any-pred [& preds] (complement (apply every-pred (map complement preds))))
или же
(defn any-pred [& preds] (fn [v] (boolean (some #(% v) preds))))