Кажется, я должен упустить какую-то очевидную часто используемую идиому, но отсутствие этих двух функций кажется мне немного озадачивающим. Существует 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))))