[英]How do I use predicates in 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))))))
提前致謝。
正如@Deigo_Basch在評論中指出的那樣,Clojure已經具有內置的“過濾器”功能,可以滿足您的需求。
但是,如果您想創建自己的學習過程來幫助自己,那么您的解決方案就差不多了:
(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的功能,一旦您了解更多,就會很快遇到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.