检查 F# 列表中是否有足够的元素

checking if enough elements in a F# list

现在我有几个这样的例子:

let doIt someList =

    if someList |> List.truncate 2 |> List.length >= 2 then
        someList[0] + someList[1]
    else
        0

我需要经常抓取列表的前 2 个元素以查看更改,但在某些情况下我没有足够的元素,我需要确保至少有 2 个。 到目前为止我发现的最好方法是在获取列表长度之前截断列表,但这会无缘无故地创建分配。

有没有更好的方法?

我想在这种情况下我会建议模式匹配:

let doIt someList =
    match someList with
    | a :: b :: _ -> a + b
    | _ -> 0

这里,ab是列表中的int,而_代表丢弃了list int。这样您就不必使用索引将前两个元素从列表中拉出,因为它们已经作为 ab 可用。 match 的最后一个案例捕获之前未匹配的任何模式,例如具有零个、一个或 three-or-more 个元素的案例。

这应该是一个开销很小的操作,因为 F# 列表是作为单链表实现的。所以 [a;b;c;d] 将表示为 a::(b::(c::(d::[])))ab 匹配,而其余的 (c::(d::[])) 保持不变(并放在 _ 槽中)。这样做不需要创建新列表。