F#如何计算列表中符合某些条件的元素数量?

时间:2010-02-11 21:18:47

标签: f#

我正在原型化我将如何处理F#数组中的Double.NaN值,并且第一步,试图简单地计算有多少值,让我难过。值“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 个答案:

答案 0 :(得分:10)

回答标题中的一般问题:

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

答案 1 :(得分:9)

对于所有n,

Double.NaN = n都是假的。有关Double.NaN的信息,请参阅the MSDN page

而是使用Double.IsNaN。有关详细信息,请参阅the MSDN page

答案 2 :(得分:8)

我认为您需要使用Double.IsNan方法。所以你的过滤功能是:

(fun x -> Double.IsNan x)

我认为问题在于NaN永远不会等于任何东西 - 甚至是另一个NaN!