对于下面,为什么最后一个返回零?功能“some”在列表列表中不起作用?
(some #(= % 1) '(1 3) ) ; ==> true
(some #(= % '(1 3)) ['(1 3) '(1 2 3)] ) ; ==> true
(some #(= % '(1 3)) '('(1 3) '(1 2 3)) ) ;==> nil
答案 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)))