如何用索引做Array.tryFind?

时间:2012-09-24 14:58:19

标签: f#

我想做的一个简单例子是

 Array.tryFind (fun elem index -> elem + index = 42) array1  //not valid

由于没有breakcontinue,我发现即使在for循环中也很难手动执行

3 个答案:

答案 0 :(得分:4)

与@ gradbot的答案类似,您可以在mapiiteri的行上定义一个模块函数,该函数适用于数组,列表和序列。

module Seq =
    let tryFindi fn seq =
        seq |> Seq.mapi (fun i x -> i, x)
            |> Seq.tryFind (fun (i, x) -> fn i x)
            |> Option.map snd

// Usage
let res = [|1;1;40;4;2|] |> Seq.tryFindi (fun i el -> i + el = 42)

答案 1 :(得分:3)

每当我发现内置函数中缺少某些内容时,我只需添加它!我总是有一个名为Helpers.fs的文件,我保留所有这些文件。只要确保给它一个好名字。

module Array =
    let tryFindWithIndex fn (array : _[]) =
        let rec find index =
            if index < array.Length then
                if fn array.[index] index then
                    Some(array.[index])
                else
                    find (index + 1)
            else
                None
        find 0

使用示例。

[|1;1;40;4;2|]
|> Array.tryFindWithIndex (fun elem index -> elem + index = 42)
|> printf "%A"

输出

Some 40

答案 2 :(得分:2)

这样的事情(免责声明:在浏览器中输入 - 可能包含错误)

array |> Seq.mapi (fun i el -> i + el) |> Seq.tryFind ((=)42)