检查 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
这里,a
和b
是列表中的int
,而_
代表丢弃了list int
。这样您就不必使用索引将前两个元素从列表中拉出,因为它们已经作为 a
和 b
可用。 match
的最后一个案例捕获之前未匹配的任何模式,例如具有零个、一个或 three-or-more 个元素的案例。
这应该是一个开销很小的操作,因为 F# 列表是作为单链表实现的。所以 [a;b;c;d]
将表示为 a::(b::(c::(d::[])))
。 a
和 b
匹配,而其余的 (c::(d::[]))
保持不变(并放在 _
槽中)。这样做不需要创建新列表。
现在我有几个这样的例子:
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
这里,a
和b
是列表中的int
,而_
代表丢弃了list int
。这样您就不必使用索引将前两个元素从列表中拉出,因为它们已经作为 a
和 b
可用。 match
的最后一个案例捕获之前未匹配的任何模式,例如具有零个、一个或 three-or-more 个元素的案例。
这应该是一个开销很小的操作,因为 F# 列表是作为单链表实现的。所以 [a;b;c;d]
将表示为 a::(b::(c::(d::[])))
。 a
和 b
匹配,而其余的 (c::(d::[]))
保持不变(并放在 _
槽中)。这样做不需要创建新列表。