2009-07-21 20 views
13

Wie überprüft man, ob ein Element in einer Sequenz enthalten ist? Ich habe ein paar Seq.contains erwartet, aber ich konnte es nicht finden. DankeÜberprüfen Sie, ob sich ein Element innerhalb einer Sequenz befindet

BEARBEITEN: Oder, für eine einfachere Aufgabe, wie man den Unterschied zwischen zwei Folgen bildet? Wie, alle Elemente innerhalb einer Liste zu bekommen, die nicht zu einer anderen gehört (oder das tut)?

+0

Für Ihre zweite Frage, siehe hier: http://stackoverflow.com/questions/1158114/f-seq-diff – Benjol

Antwort

6

Seq.exists

let testseq = seq [ 1; 2; 3; 4 ] 
let equalsTwo n = (n = 2) 
let containsTwo = Seq.exists equalsTwo testseq 
0

(Eine andere Frage, eine andere Antwort.)

Dies funktioniert, aber ich glaube nicht, dass es die idomatic Art und Weise, es zu tun - (Sie müssen zu warten, bis die USA herausfinden, wacht bis zu):

let s1 = seq [ 1; 2; 3; 4 ] 
let s2 = seq [ 3; 4; 5; 6 ] 

seq { 
    for a in s1 do 
     if not (Seq.exists (fun n -> n = a) s2) then 
      yield a 
     } 
+1

Was Sie haben, ist ein O (nm) Algorithmus, wobei n die Länge der ersten Liste und ist m ist die Länge der Sekunde. Wenn n und m ungefähr gleich sind, könnte man dies auch als O (n^2) -Algorithmus betrachten. Ich denke, es gibt viel effizientere Möglichkeiten, die Schnittmenge einer Menge zu berechnen. – Juliet

5

Set ist dein Freund hier:

let a = set [0;1;2;3] 
let b = set [2;3;4;5] 
let c = a - b 
let d = b - a 
let e = Set.intersect a b 
let f = a + b 
> 
val c : Set<int> = seq [0; 1] 
val d : Set<int> = seq [4; 5] 
val e : Set<int> = seq [2; 3] 
val f : Set<int> = seq [0; 1; 2; 3; ...] 

Danny

32

Ein wenig einfacher:

let contains x = Seq.exists ((=) x) 
+1

Wie heißt diese '(=)' Syntax bitte? –

+4

Es ist nur ein Operator, aber in einer Klammer gewickelt verhält sich wie eine normale Funktion. Operatoren bestehen aus Sonderzeichen (wie '='), die nicht als Funktionsname erkannt werden. Zum Beispiel: 'let z = x + y // ist das gleiche wie lassen z = (+) x y' –

Verwandte Themen