某些&和(首先(在clojure过滤?

时间:2014-07-28 22:29:57

标签: clojure

我看到建议可以使用some代替(first (filter,但我对它们的工作方式存在差异感到困惑。任何人都可以解释为什么这不会产生相同的结果吗?

(some (comp #{:fu} :id) [{:id :fu :baz :bar}])
> :fu

(first (filter (comp #{:fu} :id) [{:id :fu :baz :bar}]))
> {:id :fu, :baz :bar}

是否还有其他惯用且不那么冗长的方法(first (filter,即获得满足谓词的第一项?

1 个答案:

答案 0 :(得分:4)

这两种用法在语义上不相同;每个都有自己独特的用例。


(some (comp #{:fu} :id) [{:id :fu :baz :bar}])
> :fu

根据the documented behavior of some

,按照过滤后的状态返回项目
(first (filter (comp #{:fu} :id) [{:id :fu :baz :bar}]))
> {:id :fu, :baz :bar}

当且仅当它通过过滤器时,这将返回在过滤之前存在的项目。这是真的,因为filter uses its function argument only to determine whether an item should be included in its output stream;除了排除过滤函数拒绝的项目之外,它不会以任何方式改变项目。