我对f#比较新,还在学习。我正在尝试编写一个函数,它将float数组的所有NAN的索引作为int数组选项返回。
let arr = [1.0; 2.0; nan: 2.0; 4.5; nan; nan; 3.0;]
我有一个fct,它使用Array.tryFindIndex返回第一个nan的索引。 但是现在我陷入了困境,并且不知道该如何做才能让其他人从数组中获得数据。 这就是我的代码:
let indexOfOneNan (arr:array<float>) =
arr
|> Array.tryFindIndex (fun f -> nan.Equals(f))
|> fun b -> match b with
| Some (x) -> Some ([|x|])
| None -> None
答案 0 :(得分:4)
当然可以重复应用谓词,以便检索满足它的所有元素而不仅仅是第一个,但它将涉及为每个步骤分配新数组。这不会非常有效。
您可以使用Array.mapi
投影,它将索引与每个元素一起传递给谓词,并删除所有不满足谓词Array.choose
的元素。
let arr = [|1.0; 2.0; nan; 2.0; 4.5; nan; nan; 3.0;|]
arr
|> Array.mapi (fun i f ->
if System.Double.IsNaN f then Some i else None )
|> Array.choose id
// val it : int [] = [|2; 5; 6|]
编辑:
或者,您可以根据f# spec或array sequence expression
使用array comprehension
,通俗地说。对于这类问题,它们通常更简洁。
[| for i, f in Array.mapi (fun i f -> i, f) arr do
if System.Double.IsNaN f then yield i |]
// val it : int [] = [|2; 5; 6|]