在 F# 中从列表中删除 NaN 值

8

我想从列表中删除nan,因此我实现了下面所示的函数。

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”。为什么它们没有被删除呢?
1个回答

21

NaN 在方程中具有奇怪的属性。具体而言,nan = nan 是 false!在你的代码中使用以下内容:

if System.Double.IsNaN x then remove_nan rest

或者按照以下方式定义remove_nan,这样更短且不会增加堆栈:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接