Использование предиката с несколькими аргументами с фильтром в Clojure - PullRequest
0 голосов
/ 18 ноября 2018

Можно ли использовать фильтр с предикатом с несколькими аргументами?Если это так, как бы я сделал это в контексте этого кода:

   ;predicate
    (defn classInstructor [instructor class]
      (str/includes? class instructor))
    (defn instructorClasses [instructor classList]
      (filter classInstructor classList))

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Я бы сделал это так, используя анонимную функцию:

(defn classInstructor [instructor class]
  (str/includes? class instructor))

(defn instructorClasses [instructor classList]
  (filter #(classInstructor instructor %) classList))

Таким образом, когда кто-то вызывает instructorClasses, значение instructor передается в classInstructor.

0 голосов
/ 18 ноября 2018

Функция map может принимать функцию, которая применяется к нескольким аргументам. Например,

=> (map + [1 2 3] [4 5 6])
(5 7 9)

+ получает два аргумента, по одному от каждой последовательности. Нет соответствующей версии filter. Вы можете расширить стандарт filter следующим образом:

(defn filter
  ([f coll]
   (clojure.core/filter f coll))
  ([f coll & colls]
   (filter #(apply f %) (apply map vector (cons coll colls)))))

Например,

=> (filter (comp odd? +) [1 2 3] [4 6 8])
([1 4] [3 8])

Как видите, мы должны каким-то образом представить сохранившиеся последовательности. Я не считаю это убедительным или естественным. Думаю, не стоит этого делать.

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