2017-02-10 23 views
9

我想從列表中刪除nan,所以我實現瞭如下所示的函數。從F列表中刪除nans#

val it : float list = 
    [50.0; -20833.33333; 4.50701062e-14; -4.267032701e-15; 3.942195769e-16; 
    -3.555114863e-17; 3.130384319e-18; 0.0; 0.0; 0.0; 0.0; 0.0; 0.0; 
    nan; nan; nan; nan; nan; nan; nan; nan; nan] 

let rec remove_nan l = 
    match l with 
    | [] -> [] 
    | x::rest -> if x=nan then remove_nan rest 
       else x::(remove_nan rest) 

remove_nan points 

但是,它不會將nan從列表中刪除。爲什麼他們不被刪除?

回答

20

NaN有奇怪的方程性質。具體來說,nan = nan是假的!在代碼中使用此:

​​

或定義remove_nan如下,這是短,不長的堆棧:

let remove_nan = List.filter (System.Double.IsNaN >> not)