Почему у Clojure нет ни одного?или любой пред?функционировать? - PullRequest
13 голосов
/ 29 февраля 2012

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

Ответы [ 6 ]

11 голосов
/ 29 февраля 2012

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

Полагаю, никто не удосужился отправить патч? (подсказка подсказка подтолкнуть)

При использовании любого кода, основанного на 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

9 голосов
/ 29 февраля 2012

nil оценивается как ложное.(if nil 1 2) оценивается как 2.

some возвращает первый элемент, который удовлетворяет предикату.Все, что не является nil или false, оценивается как истинное.Таким образом, (if (some odd? [2 2 3]) 1 2) оценивается в 1.

3 голосов
/ 20 июля 2016

Вы ищете 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 аналогичны.

1 голос
/ 25 августа 2016

Это изменилось с выходом Clojure 1.9, который добавит функцию any?, которая будет возвращать true на любом входе.

Определение просто (defn any? [x] true), а коммит, добавляющий его, 0929d1 .


Re: some, any?, not-any?, every?, not-every?

Обратите внимание, что any? является , а не отрицанием not-any?, как вы могли ожидать, основываясь на том, как реализованы every? и not-every?, но это совершенно новая функция. Если вы ищете отрицание (неотрицание?) not-any?, то используемая функция по-прежнему some.

1 голос
/ 23 июня 2013

Кажется, они обращаются к "любому"В вопросе также упоминалось «any-pred». Как насчет чего-то подобного?

(defn any-pred [preds] (comp нет (применять каждый pred (map # (comp not%) preds))))

Для этого требуется набор, а не несколько аргументов, но изменить его будет достаточно просто.

Пример:

=> (def p (any-pred [(частичный =)"a") (частичное = "b")]))

=> (p "a") true

=> (p "b") true

=> (p "c") false

0 голосов
/ 03 октября 2014

Вы можете определить любой pred следующим образом:

(defn any-pred [& preds] (дополнить (применить каждый pred (дополнения к карте))))

или

(def any-pred [& preds] (fn [v] (булево (некоторые # (% v) preds))))

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