F # Как подсчитать количество элементов в списке, которые соответствуют некоторым критериям? - PullRequest
4 голосов
/ 12 февраля 2010

Я создаю прототип того, как я собираюсь обрабатывать значения Double.NaN в массиве F #, и первый шаг, пытаясь просто посчитать, сколько их, поставил меня в тупик. Значение "howMany" возвращается в моем коде как ноль, но я знаю, что их 2, потому что я установил значение 2 равным Double.NaN. Кто-нибудь может указать, что мне не хватает? Спасибо!

let rnd = new System.Random()
let fakeAlphas = Array.init 10  (fun _ -> rnd.NextDouble());;

fakeAlphas.[0] <- Double.NaN;
fakeAlphas.[1] <- Double.NaN;

let countNA arr = arr |> Array.filter (fun x -> x = Double.NaN) |> Array.length;;

let howMany = countNA fakeAlphas;; 

Ответы [ 3 ]

10 голосов
/ 12 февраля 2010

Чтобы ответить на общий вопрос в заголовке:

let HowManySatisfy pred = Seq.filter pred >> Seq.length 

например

let nums = [1;2;3;4;5]
let countEvens = nums |> HowManySatisfy (fun n -> n%2=0) 
printfn "%d" countEvens
9 голосов
/ 12 февраля 2010

Double.NaN = n ложно для всех n. См. страницу MSDN для Double.NaN.

Вместо этого используйте Double.IsNaN. См. на странице MSDN для получения дополнительной информации.

8 голосов
/ 12 февраля 2010

Я думаю, вам нужно использовать метод Double.IsNan. Таким образом, ваша функция фильтра будет:

(fun x -> Double.IsNan x)

Я считаю, что проблема в том, что NaN никогда не сравнится ни с чем - даже с другим NaN!

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