某些和(first (filter in clojure之间的区别是什么?

3

我曾经看到建议使用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个回答

4
这两种用法在语义上并不等同;每种用法都有其独特的使用情况。
(some (comp #{:fu} :id) [{:id :fu :baz :bar}])
> :fu

这将根据 some 的文档行为,返回经过过滤后的项目。
(first (filter (comp #{:fu} :id) [{:id :fu :baz :bar}]))
> {:id :fu, :baz :bar}

如果并且仅当项目通过过滤器时,此函数将其作为未经过滤的项目返回。这是因为 filter 仅使用其函数参数来确定是否应将项目包含在其输出流中;它不以任何方式改变项目,而只是排除被过滤函数拒绝的项目。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接