我是Clojure的新手。
假设我有一个简单的doseq
代码:
(doseq [keyval db] (f keyval))
f
是Bool函数,我想知道所有迭代是否都返回TRUE。
这就像为每个序列评估and
运算符一样。
如何检查每次迭代的结果并在doseq
之后使用它,
什么是最好的方法呢?
示例:
(and (f? :a db) (f? :b db)...)
答案 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)))