Подтвердить что ты не робот

Почему Clojure нет? или любой-пред? функционировать?

Кажется, я должен упустить какую-то очевидную часто используемую идиому, но отсутствие этих двух функций кажется мне немного озадачивающим. Существует some, но он возвращает nil вместо False, почему бы не использовать функцию any??

4b9b3361

Ответ 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))))