簡體   English   中英

在clojure中,為什么“某些”功能不能在集合上一致地工作?

[英]In clojure, why doesn't “some” function work consistently on collections?

對於下面,為什么最后一個返回零? 功能“some”不適用於列表列表?

(some #(= % 1) '(1 3)     )  ; ==> true
(some #(= % '(1 3)) ['(1 3) '(1 2 3)]    )  ; ==> true
(some #(= % '(1 3)) '('(1 3) '(1 2 3))   )  ;==> nil 

您應該像這樣修改表達式:

(some #(= % '(1 3)) '((1 3) (1 2 3))   )
=> true

您已經使用'引用了列表,您不需要在引用列表中再次引用。

您可以輕松查看REPL中發生的情況:

user=> '((1 3) (1 2 3))
((1 3) (1 2 3))
user=> '('(1 3) '(1 2 3))
((quote (1 3)) (quote (1 2 3)))

@Kevin

我看到@ntalbs回答但是我習慣於測試各種時間。 您可能很想知道我觀察到的時差:

(time (some #{'(1 3)} '((1 3) (1 2 3))))      ;0.073
(time (some #(= % '(1 3)) '((1 3) (1 2 3))))  ;0.632

(time (nil? (some #{'(1 3)} '((1 3) (1 2 3)))))     ;0.068
(time (nil? (some #(= % '(1 3)) '((1 3) (1 2 3))))) ;0.628

如果您正在處理大量數據,這可能是一個有用的知識

正如ntalbs指出的那樣,這里的問題是雙重引用。 使用向量而不是列表或使用list構建列表可能是更好的主意。 兩者都會為您節省一些混亂,矢量具有不同的性能特征(接近恆定的隨機訪問時間)。

(some #(= % '(1 3)) [[1 3] [1 2 3]])
(some #(= % '(1 3)) (list (list 1 3) (list 1 2 3)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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