1

我是 Clojure 的新手。

假设我有一个简单的doseq代码:

(doseq [keyval db] (f keyval))

f是一个布尔函数,我想知道是否所有迭代都返回 TRUE。这就像评估and每个序列的运算符一样。

如何检查每次迭代的结果并在 之后使用它doseq,最好的方法是什么?

例子:

(and (f? :a db) (f? :b db)...)
4

3 回答 3

4

doseq适用于当身体只是打算对每个元素产生副作用时。

您的示例应使用以下方式实现every?

(every? f db)
于 2013-02-23T03:09:56.457 回答
1

您不需要评估每个术语,而只需要评估第一个错误。如果我得到你的要求,试试一些

; assuming f? and db in scope

(defn all-are-f [aseq] (not (some #(not (f? % db)) aseq)))
于 2013-02-23T00:28:12.827 回答
1

有很多方法可以映射和过滤一个集合来搜索不同的东西,希望这些例子能给你一些想法:

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"
于 2013-02-23T00:18:38.500 回答