2009-07-21 9 views
13

cómo comprobar si un elemento está contenido dentro de una secuencia? Esperaba algunos Seq.contains, pero no pude encontrarlo. GraciasCompruebe si un elemento está dentro de una secuencia

EDIT: O, para una tarea más fácil, ¿cómo hacer la diferencia entre dos secuencias? Al igual que, obtener todos los elementos dentro de una lista que no pertenece a otro (o que no)?

+0

Para su segunda pregunta, consulte aquí: http://stackoverflow.com/questions/1158114/f-seq-diff – Benjol

Respuesta

6

Seq.exists

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

(Otra pregunta, otra respuesta.)

Esto funciona, pero no creo que es la forma más idiomáticas para hacerlo - (necesitará que esperar hasta que los EE.UU. se despierta para descubrir):

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

Lo que tiene es un algoritmo O (nm), donde n es la longitud de la primera lista y m es la longitud del segundo. Cuando n y m son aproximadamente iguales entre sí, también podría considerar esto como un algoritmo O (n^2). Creo que hay formas mucho más eficientes de calcular la intersección de un conjunto que este. – Juliet

5

Set es su amigo aquí:

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

Un poco más simple:

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

¿Qué es esa sintaxis '(=)' llamada por favor? –

+4

Es solo un operador, pero envuelto en corchetes se comporta como una función normal. Los operadores constan de caracteres especiales (como '=') que no se reconocen como nombre de función. Por ejemplo: 'let z = x + y // es lo mismo que let z = (+) x y' –

Cuestiones relacionadas