假设我有一个seq
,如果有任何元素,我想返回最大的值,否则返回None
。 F#似乎没有此内置函数。
这是我的尝试:
let tryMax xs =
if Seq.isEmpty xs
then
None
else
Seq.max xs |> Some
let tryMin xs =
if Seq.isEmpty xs
then
None
else
Seq.min xs |> Some
我认为这通常是一个好方法,通常我会为数组和列表添加类似的函数。
您的序列函数可能出现的问题是,它们导致第一项被计算两次。一次检查序列是否为空,一次评估整个序列以找到最小值/最大值。如果这是一个昂贵的计算,这可能是个问题。
解决此问题的最简单方法是捕获异常:
let tryMax xs =
try xs |> Seq.max |> Some
with :? System.ArgumentException ->
None