首页 > 解决方案 > Clojure:检查谓词是否恰好存在一次

问题描述

every?除了检查谓词是否只存在一次之外,是否有任何类似于someClojure 的函数?

例如:

(once? even? '(1 2 1)) => true
(once? even? '(2 2 1)) => false

标签: clojure

解决方案


我不知道有任何类似的功能,clojure.core也没有遇到过宣传这个的现有图书馆。

查看somein的实现clojure.core,它使用recurbutonce?你需要一种机制来记住你以前是否见过一个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.


推荐阅读