clojure - Clojure:检查谓词是否恰好存在一次
问题描述
every?
除了检查谓词是否只存在一次之外,是否有任何类似于some
Clojure 的函数?
例如:
(once? even? '(1 2 1)) => true
(once? even? '(2 2 1)) => false
解决方案
我不知道有任何类似的功能,clojure.core
也没有遇到过宣传这个的现有图书馆。
查看some
in的实现clojure.core
,它使用recur
butonce?
你需要一种机制来记住你以前是否见过一个true
值。使该内部值作为三元调用可见,似乎很难看。另外,如果没有必要,我想避免完全遍历集合。
因此,我会选择减少:
(defn once? [pred coll]
(reduce
(fn once-reduce-fn [seen-true it]
(if (pred it)
(if seen-true
(reduced false)
true)
seen-true))
false
coll))
;; You can use this code under the Apache Software License 2.0
;; in addition to StackOverflow defaults
当它从谓词中看到第二个真实结果时,它会停止迭代集合,并且也适用于空集合或nil
.
推荐阅读
- javascript - 是的,验证访问 parent.parent
- ios - 当标记拖动到达iOS中的屏幕边界时如何移动地图相机?
- visual-studio - 为什么适用于 Visual Studio 2017 和 2019 的 .Net Core SDK 不同?
- sql - SQL - 中断查询
- php - 如何使用 laravel 发送电子邮件
- java - 处理静态和非静态变量
- c++ - 自动非类型模板参数:Clang 中不明确的偏特化
- ios - UITableView 里面的 UITableViewCell 高度问题
- c# - 我们应该创建一个脚本来运行“清理”任务,还是应该直接在程序中执行?
- audio - imx7d 上的 I2S:无法打开 pcm_out 驱动程序