Что является корректным “clojure путь”, чтобы проверить, не ли набор пуст

Я хочу записать функцию, которая возвратила бы булевскую переменную, верную, если данный набор не является пустым и ложным иначе.

Я мог или сделать

defn ..
(boolean (seq coll))

или

defn ..
(not (empty? coll))

Поскольку я плохо знаком с clojure, я был первоначально склонен пойти с № 2 (более читаемый), но clojure ссылка API для empty? явно говорит, используют идиому (seq coll) вместо (not (empty? coll)), возможно, избегать двойного отрицания.

Я хочу знать то, что является clojure способом проверить, непуст ли набор, и возвратите истинную/ложную булевскую переменную.

23
задан amalloy 15 July 2011 в 20:14
поделиться

2 ответа

Упомянутый вами отрывок из docstring empty? означает, в частности, что такая nonempty? никогда не должна быть необходимой или даже особенно полезной, потому что seq всегда может заменить ее в булевых контекстах, что в чистом коде Clojure и происходит.

Если вы чувствуете, что вынуждены написать такую функцию, я скажу, что первый подход мне нравится больше. empty? все равно построена на seq, так что от ее вызова не уйти; просто приведение результата к булеву кажется более чистым, чем два захода через not. Другие варианты смотрите, например, nil?, false? (я все же предпочитаю приведение).

Кстати, почему вы хотите написать это...? Возможно, для вызова метода Java с аргументом boolean? В таком случае, я думаю, приведение хорошо выражает намерение.

Обновление: Пример, иллюстрирующий последний пункт:

  1. Простой класс Java:

    public class Foo {
     public static boolean foo(boolean arg) {
     return !arg;
     }
    }
    
  2. Некоторый клиентский код Clojure:

    (Foo/foo nil)
    ; => NullPointerException
    (Foo/foo (boolean nil))
    ; => true
    
12
ответ дан 29 November 2019 в 01:58
поделиться

В дополнение к отличному ответу Михала Марчика, я отмечу, что существует специфическая функция not-empty:

http://clojure.github.io/clojure/clojure.core-api.html#clojure.core/not-empty

но она делает не совсем то, что вы просите. (Хотя она будет работать в большинстве ситуаций).

Not-empty возвращает nil, если коллекция пуста, и саму коллекцию, если коллекция не пуста. Для тестов предикатов это будет работать хорошо. Если вам действительно нужны значения true и false, то (not (empty? x)) - это то, что вам нужно.

4
ответ дан 29 November 2019 в 01:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: