Как я могу проверить, является ли последовательность пустой в F #? - PullRequest
10 голосов
/ 05 ноября 2010

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

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

Ответы [ 2 ]

16 голосов
/ 05 ноября 2010

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

if Seq.isEmpty yourSeqName then doSomething else doSomethingElse

Кстати, Seq.empty создает пустой Seq. Это не проверяет один.

2 голосов
/ 05 ноября 2010

Seq.isEmpty

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...