Clojureは初めてです。
簡単なdoseq
コードがあるとしましょう:
(doseq [keyval db] (f keyval))
f
はブール関数であり、すべての反復がTRUEを返したかどうかを知りたいです。and
これは、各シーケンスの演算子を評価するのと同じです。
各反復の結果を確認して、の後に使用するにはどうすればdoseq
よいですか?また、それを行うための最良の方法は何ですか?
例:
(and (f? :a db) (f? :b db)...)
Clojureは初めてです。
簡単なdoseq
コードがあるとしましょう:
(doseq [keyval db] (f keyval))
f
はブール関数であり、すべての反復がTRUEを返したかどうかを知りたいです。and
これは、各シーケンスの演算子を評価するのと同じです。
各反復の結果を確認して、の後に使用するにはどうすればdoseq
よいですか?また、それを行うための最良の方法は何ですか?
例:
(and (f? :a db) (f? :b db)...)
doseq
ボディが要素ごとに副作用を生成することだけを目的としている場合に使用します。
あなたの例は次のように実装する必要がありますevery?
:
(every? f db)
すべての用語を評価する必要はありませんが、最初のfalseまでだけ評価する必要があります。私があなたが求めているものを手に入れたら、いくつか試してみてください。
; assuming f? and db in scope
(defn all-are-f [aseq] (not (some #(not (f? % db)) aseq)))
コレクションをマッピングおよびフィルタリングしてさまざまなものを検索する方法はたくさんあります。これらの例からいくつかのアイデアが得られることを願っています。
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"