簡體   English   中英

如何在Clojure中使用謂詞?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM