代码之家  ›  专栏  ›  技术社区  ›  esac

如何使用trypick获取序列的第一个元素?

  •  10
  • esac  · 技术社区  · 15 年前

    今天我试图使用seq.first,编译器说它已经被弃用了,取而代之的是seq.trypick。它说它应用一个函数并返回返回一些结果的第一个结果。我想我可以说有趣的x->x!=0,因为我知道在我的情况下,第一个会返回一些,但是这里应该设置什么约束?正确的语法是什么?

    为了澄清,我想用以下格式:

    let foo(x:seq<int>) =
       x.filter(fun x -> x>0)
       |> Seq.tryPick (??)
    
    1 回复  |  直到 15 年前
        1
  •  19
  •   Ryan Lundy    10 年前

    关键是“seq.first”没有返回第一个元素,而是返回了与某些“choose”谓词匹配的第一个元素:

    let a = [1;2;3]
    // two ways to select the first even number (old name, new name)
    let r1 = a |> Seq.first (fun x -> if x%2=0 then Some(x) else None) 
    let r2 = a |> Seq.tryPick (fun x -> if x%2=0 then Some(x) else None) 
    

    如果只需要第一个元素,请使用seq.head

    let r3 = a |> Seq.head