2010-11-05 12 views
10

Rozważmy następujący kod F #, które oblicza współczynnik liczby:Jak mogę sprawdzić, czy sekwencja jest pusta w 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 

Innymi słowy, jeśli factors jest pusty, a następnie powrócić n. W przeciwnym razie ściągnij pierwszy element z factors. Celem jest, aby uwzględnić wszystkie czynniki, między 1 a (n/2) i sam n od 1 do n zawsze czynniki n.

Test factors = seq [] nie działa. Przyjechałem w tej składni, patrząc na to:

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

Jednak nie sądzę seq [] jest właściwie pusta sekwencja:

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

Jak mogę sprawdzić, czy ciąg jest pusty?

Odpowiedz

16

Wypróbuj Seq.isEmpty.

if Seq.isEmpty yourSeqName then doSomething else doSomethingElse 

Nawiasem mówiąc, Seq.empty tworzy pusty Seq. Nie sprawdza się na jedno.

+0

Dzięki. To była pierwsza odpowiedź ułamkiem sekundy! – user392226

2

Seq.isEmpty

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

Problem z testu =, jak sądzę, jest to, że porównanie dwóch różnych obiektów typu IEnumerable<int> dla referencyjnej-równości.

+0

Dzięki. Przyjrzałem się wszystkim funkcjom modułu dla 'Seq', ale nie byłem wystarczająco ostrożny. Przeoczyłem 'Seq.isEmpty'. – user392226

Powiązane problemy