2010-02-11 53 views
2

我正在原型设计中如何处理F#数组中的Double.NaN值,并且第一步试图简单计算其中有多少个,这让我难住了。值“howMany”在我的代码中返回为零,但我知道有2个,因为我将2的值设置为Double.NaN。任何人都可以指出我缺少的东西吗?谢谢!F#如何计数列表中符合某些条件的元素数量?

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;; 

回答

9

Double.NaN = n对于所有的n都是错误的。有关Double.NaN,请参阅the MSDN page。可以使用Double.IsNaN。有关更多信息,请参阅the MSDN page

7

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

(fun x -> Double.IsNan x) 

我相信这个问题是楠总是不等于任何东西 - 甚至是另一个NaN的!

+0

啊,_“请使用isNaN确定某个值是否不是数字是无法确定通过将其与另一个与NaN相等的值进行比较来确定值是否不是数字。“_〜http://msdn.microsoft.com/en-us/library/system.double.nan(VS.100).aspx – nlucaroni 2010-02-11 21:26:21

+4

How关于'Double.IsNan'而不是'(fun x - > Double.IsNan x)'? – Cogwheel 2010-02-11 21:54:28

+0

@Cogwheel:你说的对。匿名功能是不必要的。 – pblasucci 2010-02-11 23:00:59

8

要回答标题中的一般问题:

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 
相关问题