2017-02-10 2 views
9

nanをリストから削除したいので、以下の関数を実装しました。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 

ただし、リストからnanを削除しません。なぜ彼らは取り除かれていないのですか?

答えて

20

NaNには奇妙な等式特性があります。具体的には、nan = nanはfalseです。あなたのコードでこれを使用します。

​​

または、次のように短く、スタックを成長しない、remove_nanを定義します。

let remove_nan = List.filter (System.Double.IsNaN >> not) 
関連する問題