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

时间:2014-07-10 03:29:46

标签: list clojure lisp

对于下面,为什么最后一个返回零?功能“some”在列表列表中不起作用?

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

3 个答案:

答案 0 :(得分:10)

您应该像这样修改表达式:

(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)))

答案 1 :(得分:2)

@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

如果您正在处理大量数据,这可能是一项有用的知识

答案 2 :(得分:2)

正如ntalbs所指出的,这里的问题是双引号。使用向量而不是列表或使用list构建列表可能更好。两者都可以避免一些混乱,矢量具有不同的性能特征(接近恒定的随机访问时间)。

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