2010-11-05 13 views
10

Considerate questo codice # F che calcola un fattore di un numero:Come posso verificare se una sequenza è vuota in 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 

In altre parole, se factors è vuota, poi tornare n. Altrimenti, estrai il primo elemento da factors. L'obiettivo è quello di tenere conto di tutti i fattori tra 1 e (n/2) e n stessa dal 1 e n sono sempre fattori di n.

Il test factors = seq [] non funziona. Sono arrivato a questa sintassi, cercando in questo modo:

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

Tuttavia, non credo che seq [] è in realtà una sequenza vuota:

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

Come posso verificare se un sequenza è vuota?

risposta

16

Prova Seq.isEmpty.

if Seq.isEmpty yourSeqName then doSomething else doSomethingElse 

A proposito, Seq.empty crea un Seq vuoto. Non prova per uno.

+0

Grazie. Questa è stata la prima risposta da una frazione di secondo! – user392226

2

Seq.isEmpty

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

Il problema con il test =, presumo, è che sta confrontando due diversi oggetti di tipo IEnumerable<int> per riferimento-uguaglianza.

+0

Grazie. Ho esaminato tutte le funzioni del modulo per 'Seq', ma non sono stato abbastanza attento. Ho trascurato 'Seq.isEmpty'. – user392226

Problemi correlati