F# 数组查找索引异常处理

6

我有以下函数可以在数组中查找索引:

let numbers_array = [| "1"; "2"; "3"|]
let findIndex arr elem = arr |> Array.findIndex ((=) elem)

let s = "123"
findIndex numbers_array (string s.[0]))

然而,如果我尝试运行

findIndex numbers_array (string s.[10]))

它会超出边界并抛出以下错误:

System.Collections.Generic.KeyNotFoundException:未在集合中找到满足谓词的索引。

我如何使我的函数不抛出异常,而是执行类似 printf 语句的操作?


1
我相信有一个tryFindIndex。 - Bent Tranberg
tryFindIndex 返回一个选项类型,我无法使用。 - Marcus F
1
为什么不能使用选项?虽然您可以捕获“KeyNotFoundException”,但在错误情况下仍需要决定返回什么。 - Lee
问题包含应该被纠正的错误。源代码无法编译。也没有展示斜体字中所述的错误。提到的越界错误发生在函数参数中,因此不相关。 - Bent Tranberg
tryFindIndex 绝对是正确的选择。如果您不想更改函数的签名,可以在 tryFindIndex 返回 None 的情况下使用 printf,然后返回 -1。(请参见下面基于此的建议答案。) - Brian Berns
1个回答

4

我想这与你想要的接近:

let findIndex arr elem =
    match arr |> Array.tryFindIndex ((=) elem) with
        | Some index -> index
        | None ->
            printfn "Not found"
            -1

它保持现有的函数签名,在找不到元素时生成错误消息作为副作用。(请注意,即使是这种情况下,该函数仍然必须返回一个 int,所以我选择了 -1。)


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