2017-02-10 18 views
9

Chcę usunąć nan s z listy, więc mam zaimplementowaną funkcję pokazaną poniżej.Usuwanie nans z listy w F #

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 

Jednak nie usuwa ona nan z listy. Dlaczego nie są usuwane?

Odpowiedz

20

NaN ma dziwne właściwości równania. W szczególności, nan = nan jest fałszywy! Użyj tego w kodzie:

if System.Double.IsNaN x then remove_nan rest 

lub zdefiniować remove_nan następująco, która jest krótsza i nie rośnie stos:

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