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

すべての用語を評価する必要はありませんが、最初のfalseまでだけ評価する必要があります。私があなたが求めているものを手に入れたら、いくつか試してみてください。

; 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 に答える