Как я могу проверить, если последовательность пуста в F #?

Рассмотрим этот код 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

Другими словами, если factors пусто, верните n. В противном случае вытащите первый элемент из factors. Цель состоит в том, чтобы учитывать все факторы между 1 и (n/2) и самим n, так как 1 и n всегда являются факторами n.

Тест factors = seq [] не работает. Я пришел к этому синтаксису, посмотрев на это:

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

Однако, я не думаю, что seq [] на самом деле является пустой последовательностью:

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

Как я могу проверить, является ли последовательность пустой?

Ответ 1

Попробуйте Seq.isEmpty.

if Seq.isEmpty yourSeqName then doSomething else doSomethingElse

Кстати, Seq.empty создает пустой Seq. Он не тестирует его.

Ответ 2

Seq.isEmpty

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

Проблема с вашим тестом =, я полагаю, заключается в том, что он сравнивает два разных объекта типа IEnumerable<int> для ссылочного равенства.