我是 Clojure 的新手。
假设我有一个简单的doseq
代码:
(doseq [keyval db] (f keyval))
f
是一个布尔函数,我想知道是否所有迭代都返回 TRUE。这就像评估and
每个序列的运算符一样。
如何检查每次迭代的结果并在 之后使用它doseq
,最好的方法是什么?
例子:
(and (f? :a db) (f? :b db)...)
我是 Clojure 的新手。
假设我有一个简单的doseq
代码:
(doseq [keyval db] (f keyval))
f
是一个布尔函数,我想知道是否所有迭代都返回 TRUE。这就像评估and
每个序列的运算符一样。
如何检查每次迭代的结果并在 之后使用它doseq
,最好的方法是什么?
例子:
(and (f? :a db) (f? :b db)...)
doseq
适用于当身体只是打算对每个元素产生副作用时。
您的示例应使用以下方式实现every?
:
(every? f db)
您不需要评估每个术语,而只需要评估第一个错误。如果我得到你的要求,试试一些。
; assuming f? and db in scope
(defn all-are-f [aseq] (not (some #(not (f? % db)) aseq)))
有很多方法可以映射和过滤一个集合来搜索不同的东西,希望这些例子能给你一些想法:
user> (def db {:a 1 :b 2 :c 3 :d 4})
#'user/db
user> (map (fn [[k v]] (if (even? v) true false)) db)
(false false true true)
user> (filter (fn [[k v]] (if (even? v) true false)) db)
([:b 2] [:d 4])
有几种方法可以查看它们是否都是真的:
user> (reduce #(and %1 %2)
(map (fn [[k v]] (if (even? v) true false))
{:a 2 :b 4 :c 6}))
true
user> (reduce #(and %1 %2) (map (fn [[k v]] (if (even? v) true false)) db))
false
user> (not-any? false? (map (fn [[k v]] (if (even? v) true false)) db))
false
user> (not-any? false? (map (fn [[k v]] (if (even? v) true false)) {:a 2 :b 4 :c 6}))
true
并查看数据库中的其他内容:
user> (filter (fn [[k v]] (if (even? v) true false)) {:a 2 :b 4 :c 6})
([:a 2] [:c 6] [:b 4])
user> (filter (fn [[k v]] (if (odd? v) true false)) {:a 2 :b 4 :c 6})
()
user> (if (empty? (filter (fn [[k v]] (if (odd? v) true false)) {:a 2 :b 4 :c 6})) "all where even" "some where odd")
"all where even"