【问题标题】:using doseq with bool function使用带 bool 函数的 doseq
【发布时间】:2013-02-23 00:07:13
【问题描述】:

我是 Clojure 的新手。

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

(doseq [keyval db] (f keyval))

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

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

例子:

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

【问题讨论】:

  • doseq 可能不是您要搜索的内容

标签: clojure


【解决方案1】:

doseq 用于当 body 只打算对每个元素产生副作用时。

你的例子应该用every?实现:

(every? f db)

【讨论】:

    【解决方案2】:

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

    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"
    

    【讨论】:

      【解决方案3】:

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

      ; assuming f? and db in scope
      
      (defn all-are-f [aseq] (not (some #(not (f? % db)) aseq)))
      

      【讨论】:

        猜你喜欢
        • 2021-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-17
        • 2014-10-09
        • 2013-05-05
        • 1970-01-01
        相关资源
        最近更新 更多