2014-09-04 3 views
0

Я немного новичок в clojure, и я не уверен, как использовать предикаты. Например, как создать функцию, которая возвращает элементы в списке, который удовлетворяет предикату.Как использовать предикаты в clojure?

>(filter-in number? '(a 2 (1 3) b 7)) 
(2 7) 

>filter in symbol? '(a (b c) 17 foo)) 
(a foo) 

Я попытался это, но он не работает:

(defn filter-in [pred lst] 
    (fn [x] 
    (if (empty? lst) 
     () 
     (if (pred (first lst)) 
     (cons (first lst) (filter-in pred (rest lst))) 
     (filter-in pred (rest lst)))))) 

Спасибо заранее.

+0

Вы имели в виду '(номер фильтра? '(A 2 (1 3) b 7))'? –

+0

Нет, имя функции является фильтром. –

+0

@ChrisPhillips - ваш второй пример использования, в котором отсутствует открытый палец и '-' от имени функции? – noisesmith

ответ

1

Как отмечает @Deigo_Basch в комментариях, у Clojure уже есть встроенная функция 'filter', которая делает то, что вы хотите.

Однако, если вы пытаетесь создать свой собственный, чтобы помочь с процессом обучения, ваше решение почти нет:

(defn filter-in [pred lst] 
    (if (empty? lst) 
     '() 
     (if (pred (first lst)) 
     (cons (first lst) (filter-in pred (rest lst))) 
     (filter-in pred (rest lst))))) 

Ваше оригинальное решение было на самом деле определить функцию, которая возвращала другую функцию (' fn [x] '). Функции более высокого уровня, подобные тем, которые возвращают другие функции, часто полезны, но в этом случае вы ищете что-то, что выполняется на его аргументах напрямую.

Обратите внимание, что ваше определение не является ленивым, в отличие от встроенного фильтра Clojure. Он также не использует механику циклов-повторов Clojure и, таким образом, может взорвать стек в больших списках. Это особенности Clojure, с которыми вы столкнетесь в ближайшее время, когда узнаете больше.

Смежные вопросы