在 clojure 中,为什么"some"函数不能在集合上始终如一地工作?



对于下面,为什么最后一个返回nil?函数"一些"不工作的列表的列表?

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

最新更新