2010-11-20 31 views
1

我對f#的選項類型進行了大腦凍結。我有3本書,盡我所能讀,但我沒有得到它們。Duh?幫助f#選項類型

有人有一個清晰和簡潔的解釋,也許是一個現實世界的例子?

TIA

加里

+0

可能也見http://stackoverflow.com/questions/3989264/best-explanation-for-languages-without-null/3990754#3990754 – Brian 2010-11-20 20:12:50

回答

2

見,

http://msdn.microsoft.com/en-us/library/dd233245.aspx

選項類型背後的直覺是, 「實行」 一個空值。但與null相反,必須明確要求值可以爲null,而在大多數其他語言中,默認情況下引用可以爲null。如果您熟悉這些,則與SQL有相似性NULL/NOT NULL。

爲什麼這很聰明?它很聰明,因爲該語言可以假設沒有輸出的任何表達式都可以爲空。因此,它可以消除代碼中的所有空指針檢查,產生很多額外的速度。此外,如果程序員希望產生安全的代碼,它不必檢查空字符串是否完全相同。

對於程序需要空值的少數情況,選項類型存在。作爲一個例子,考慮一個在.ini文件中要求密鑰的函數。返回的密鑰是一個整數,但.ini文件可能不包含密鑰。在這種情況下,如果找不到密鑰,返回'null'是有意義的。沒有一個整數值是有用的 - 用戶可能在文件中輸入了正確的整數值。因此,我們需要「提升」整數域,並給它一個代表「無信息」的新值,即空值。所以我們把'int'換成'int選項'。現在,如果沒有整數值,我們將得到'None',如果有一個整數值,我們將得到'Some(N)',其中N是所討論的整數值。

選擇有兩個美麗的後果。其一,我們可以使用F#的一般模式匹配特徵來區分例如case表達式中的值。二,用於定義選項類型的代數數據類型框架向程序員公開。也就是說,如果F#中沒有選項類型,我們可以自己創建它!

5

Brian's answer已被評爲option類型的最佳解釋,因此您應該閱讀它:-)。我將嘗試使用簡單的F#示例編寫更簡潔的解釋...

假設您有一個產品數據庫,並且需要一個搜索數據庫並返回具有指定名稱的產品的函數。當沒有這樣的產品時,該功能應該做什麼?當使用null,代碼看起來是這樣的:

Product p = GetProduct(name); 
if (p != null) 
    Console.WriteLine(p.Description); 

這種方法的問題是,你不會被強迫進行檢查,這樣你就可以很容易地編寫代碼,將拋出一個意外的異常時,產品不發現:

Product p = GetProduct(name); 
Console.WriteLine(p.Description); 

當使用option類型,你正在做的可能性缺失值明確。在F#中定義的類型不能有null的值,並且當您想要編寫可能返回或不可返回值的函數時,您不能返回Product - 而是需要返回option<Product>,因此上面的代碼看起來像這樣(我添加了類型註釋,這樣就可以看到類型):

let (p:option<Product>) = GetProduct(name) 
match p with 
| Some prod -> Console.WriteLine(prod.Description) 
| None ->() // No product found 

你不能直接訪問Description屬性,因爲搜索的reuslt不Product。要獲得實際的Product值,您需要使用模式匹配,這會強制您在缺少值時處理這種情況。

總結。總而言之,option類型的用途是使類型中的「缺失值」顯式化,並強制您檢查每次使用可能丟失的值時是否有值。