使用剂量与bool功能

时间:2013-02-23 00:07:14

标签: clojure

我是Clojure的新手。

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

(doseq [keyval db] (f keyval))

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

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

示例:

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

3 个答案:

答案 0 :(得分:4)

doseq适用于身体只是为每个元素产生副作用的时候。

您的示例应使用every?实现:

(every? f db)

答案 1 :(得分: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"

答案 2 :(得分:1)

您不需要评估每个字词,但只能评估第一个字词。如果我得到您要求的内容,请尝试some

; assuming f? and db in scope

(defn all-are-f [aseq] (not (some #(not (f? % db)) aseq)))