对于下面,为什么最后一个返回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)))