2009-07-30 4 views

Antwort

9

könnten Sie every? verwenden:

user=> (every? string? '("hi" 1)) 
false 

Hier ist die Dokumentation auf every?.

1

every? werden fragen "Funktioniert diese eine Funktion für jedes Mitglied der Seq True", die nahe ist, was ich denke, dass Sie fragen. Eine Verbesserung auf every? würde eine Liste von Funktionen nehmen und fragen: "Sind all diese Prädikate für jedes Mitglied dieser Sequenz wahr?". Hier

ist ein erster Versuch:

(defn andmap? [data tests] 
    (every? true? (for [d data, f tests] 
        (f d)))) 

user> (andmap? '(2 4 8) [even? pos?]) 
true 
user> (andmap? '(2 4 8) [even? odd?]) 
false 
1

ich andmap als Makro geschrieben, die Prädikate als Argumente und baut eine Funktion übernimmt, dass „wickelt eine and um die Prädikate“, dh

(andmap integer? odd?) 
==> 
(fn [x] (and (integer? x) 
      (odd? x))) 

(es erweitert sich nicht zu genau dies, aber es erweitert sich zu etwas Äquivalent dazu)

Dies hat den Vorteil, dass es auf den Prädikaten shortcuircuts, so dass Sie

(every? (andmap integer? odd?) [1 3 "a string"]) 

, ohne sich eine Laufzeitausnahme schreiben können, wie Sie mit Arthurs answer bekommen würde. Hier

ist die Definition von andmap:

 
(defmacro andmap 
    ([]  `(fn [& x#] true)) 
    ([p & ps] `(fn [& x#] (and (apply ~p x#) 
          (apply (andmap [email protected]) x#))))) 

Es ist auch möglich andmap als Funktion zu definieren, die auch Kurzschlüsse auf seine Prädikate aufgrund lazyness:

 
(defn andmap [& ps] 
    (fn [& x] 
    (every? true? (map (fn [p] (apply p x)) ps)))) 

Die Prädikate andmap kann eine beliebige Anzahl von Argumenten annehmen, so dass es möglich ist,

(map (andmap #(and (integer? %1) 
        (integer? %2)) 
      #(and (odd? %1) 
        (even? %2)) 
      <) 
    [1 3 9] 
    [2 6 "string"]) 
zu schreiben

was zu (true true false) auswertet.

2

Clojure 1.3 fügt all-pred (und den zugehörigen Suffix für die "oder" -Version) hinzu.

clojure.core/Every-pred ([p] [p1 p2] [p1 p2 p3] [p1 p2 p3 & ps])

einen Satz von Prädikaten nimmt und eine Funktion f, die wahr zurückgibt Wenn alle zusammensetzenden Vergleichselemente einen logischen wahren Wert für alle Argumente zurückgeben, gibt es andernfalls false zurück. Beachten Sie, dass f kurzgeschlossen ist, da es die Ausführung des ersten -Arguments stoppt, das ein logisches falsches Ergebnis gegen die ursprünglichen Prädikate auslöst.

könnte eine naive Implementierung sein:

(defn every-pred [& preds] (fn [& args] (alle # (alle% args) preds))?)

aber die tatsächliche Implementierung wird eine bessere Leistung haben.

Verwandte Themen