2010-05-06 34 views

回答

12

注意,F#中的更地道的做法會可能是使用沿着Seq.tryFind的行,而不是使用LINQ運算符,雖然它不是替代品的下降,因爲它返回一個期權價值。

+1

我也是會建議使用'Seq.tryFind':使用它作爲

module Seq = let tryHead (ls:seq<'a>) : option<'a> = ls |> Seq.tryPick Some 

:我會定義一個函數tryHead與簽名seq<'a> -> option<'a>值(因爲它們很危險)。處理選項值比較容易,你也可以使用'Option.map'和其他函數來處理它們(儘管這可能不適用於F#LINQ to SQL) – 2010-05-06 21:06:35

+0

是的,'Seq.tryFind(fun _ - > true )'很好。 – 2010-05-06 21:36:48

3

或者,你可以很容易地定義自己的firstordefault:

let firstordefault list = 
    match list with 
    | head :: tail -> head 
    | [] -> 0 // some default value 

例子:

let exampleList = [ 1; 2; 3 ] 

使用F#互動,

firstordefault exampleList;; 
val it : int = 1 
7

因爲Seq模塊已經有一個head功能類型seq<'a> -> 'a,在F#中,你通常嘗試使用到aviod`null` -

[1; 2; 3] |> Seq.tryHead 
+2

自從'tryHead'(https://github.com/Microsoft/visualfsharp/commit/b10392dc16593bf9286583e2a87217d18fa18b8a)已被添加到F#4.0中。 – 2016-12-30 00:18:55