在F#中做tryMax和tryMin的最佳方法?

问题描述 投票:1回答:1

假设我有一个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
  • 此方法是否有问题?
  • 是否有内置的解决方案?
f# seq
1个回答
0
投票

我认为这通常是一个好方法,通常我会为数组和列表添加类似的函数。

您的序列函数可能出现的问题是,它们导致第一项被计算两次。一次检查序列是否为空,一次评估整个序列以找到最小值/最大值。如果这是一个昂贵的计算,这可能是个问题。

解决此问题的最简单方法是捕获异常:

let tryMax xs =
    try xs |> Seq.max |> Some
    with :? System.ArgumentException ->
        None
© www.soinside.com 2019 - 2024. All rights reserved.