2011-02-14 75 views
0

空值處理正如你可以通過我在問,我真的越來越深成F#:)問題的質量在F#

另一個疑問接近我的學習路徑看:空值。由於.NET框架和F#(或者框架中的任何其他語言)之間的緊密集成,如何處理它們呢?

爲了簡單起見,這裏的代碼片段:

let myfunc alist = 
    try 
     List.find (fun x -> true) alist 
    with 
     | :? KeyNotFoundException as ex -> (* should return null *) 

我怎樣才能在一個函數返回一個空?
null關鍵字無用,除非得到確認(nil不相同)。
而且,一般來說,處理空返回值的最佳做法是什麼?

回答

6

我不太確定問題是什麼。如果您完成例如:

open System.Collections.Generic 

let myfunc alist = 
    try 
     List.find (fun x -> true) alist 
    with 
     | :? KeyNotFoundException as ex -> null 

你會發現,它編譯就好了,並推斷出的類型myfunc : 'a list -> 'a when 'a : null表示存儲在列表中,你傳遞的類型必須有null作爲一個適當的值。當使用在C#,VB.NET等中定義的類型時,F#完全能夠處理空值。但是,當您不與使用另一種.NET語言編寫的代碼進行互操作時,典型方法是返回一個'a option來表明一個值可能存在也可能不存在。然後,你的榜樣將成爲:

let myfunc alist = 
    try 
     List.find (fun x -> true) alist 
     |> Some 
    with 
     | :? KeyNotFoundException as ex -> None 

將含有任何類型的(甚至不具有null作爲一個適當的值的)名單的工作。當然,在這種情況下,您可以使用List.tryFind (fun _ -> true)代替。

+2

我同意,但我認爲`List.tryFind`更值得一提。要求.NET框架生成一個調用堆棧,並在每次找不到要查找的內容時拋出異常並不是實現良好性能的方式。 `let myfunc = List.tryFind(fun _ - > true)`是要走的路。 – 2011-02-14 21:34:33