2010-11-05 10 views
10

consideran este # código F, que calcula un factor de un número:¿Cómo puedo comprobar si una secuencia está vacía en F #?

let n = 340339004337I 

// A sequence of all factors: 
let factors = seq { 1I .. n/2I} |> Seq.filter (fun x -> n % x = 0I) 

// Pull off the first factor from the sequence: 
let factor = 
    if factors = seq [] then 
     n 
    else 
     factors |> Seq.nth 0 

En otras palabras, si factors está vacía, y luego volver n. De lo contrario, saque el primer elemento de factors. El objetivo es dar cuenta de todos los factores de entre 1 y (n/2), y n sí mismo desde el 1 y n son siempre factores de n.

La prueba factors = seq [] no funciona. Llegué a esta sintaxis examinado esto:

> seq {1 .. 100} |> Seq.filter (fun x -> false) ;; 
val it : seq<int> = seq [] 

Sin embargo, no creo seq [] es en realidad una secuencia vacía:

> Seq.empty = seq [] ;; 
val it : bool = false 

¿Cómo puedo probar si una secuencia está vacía?

Respuesta

16

Probar Seq.isEmpty.

if Seq.isEmpty yourSeqName then doSomething else doSomethingElse 

Por cierto, Seq.empty crea una Seq vacía. No prueba para uno.

+0

Gracias. ¡Esta fue la primera respuesta por una fracción de segundo! – user392226

2

Seq.isEmpty

http://msdn.microsoft.com/en-us/library/ee353547.aspx

El problema con su prueba =, supongo, es que se está comparando dos objetos diferentes del tipo IEnumerable<int> de referencia igualdad.

+0

Gracias. Miré todas las funciones del módulo para 'Seq', pero no fue lo suficientemente cuidadoso. Pasé por alto 'Seq.isEmpty'. – user392226

Cuestiones relacionadas