回答
見,
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#中沒有選項類型,我們可以自己創建它!
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
類型的用途是使類型中的「缺失值」顯式化,並強制您檢查每次使用可能丟失的值時是否有值。
- 1. 需要幫助瞭解F#類語法
- 2. F#類型的選項問題
- 3. 選項和類型確定f#
- 4. 序列化F#選項類型
- 5. F#選項類型執行計算
- 6. F#:幫助創建看似動態類型的成員約束
- 7. jquery幫助onclick選項
- 8. 幫助選項卡教程
- 9. 幫助MvcContrib列選項
- 10. 是F#引用類型中的選項類型?
- 11. 幫助佈局類型
- 12. jQueryUI可拖動助手選項幫助
- 13. 需要幫助簡化LINQ查詢:選擇首選類型的項目
- 14. 需要幫助HTML選擇選項
- 15. SQL幫助有選擇選項
- 16. 幫助我理解OBJ-C類類型
- 17. 需要一些幫助,以幫助類型推理引擎
- 18. 幫助編寫monad類型類(關聯類型類?)
- 19. 選擇幫助?
- 20. F#幫助:「收集已修改」
- 21. 幫助FOR/F批處理文件
- 22. wordpress邏輯幫助(下拉)選擇項
- 23. 需要Shell腳本-awk選項幫助
- 24. 多個選項SQLite查詢幫助
- 25. 多選項應用程序的幫助?
- 26. 3個選項的統計幫助
- 27. 需要幫助實施搜索選項
- 28. Swift 3.0快速幫助選項鍵
- 29. SAS宏使用幫助選項
- 30. Android Tab選項佈局幫助
可能也見http://stackoverflow.com/questions/3989264/best-explanation-for-languages-without-null/3990754#3990754 – Brian 2010-11-20 20:12:50