2015-12-07 141 views
1

爲什麼我不得不爲None返回一個類型值?爲什麼我不得不爲None返回一個類型值?

let getHand = function 
    | Some(card1, card2) -> card1, card2 
    | None -> // ? 

就我而言,我想處理一個問題。但如果通過選項不存在手牌,我仍然無法處理。

我不考慮什麼? 我應該使用什麼樣的模式?

具體來說,如果沒有手,那麼我想抓住一個完整的甲板。 如果沒有結果存在,爲什麼方法會產生複雜類型的結果?

| None -> // Why am I still required to yield a typed result 

回答

9

F#中的所有值都有類型。函數也可以。

getHand函數看起來像輸入一個option值。由於option值是歧視聯盟,因此該函數必須解決可能的輸入情況。編譯器和類型系統可以幫助你做到這一點。

函數類型的一部分是它的返回值。在F#中,函數只能有一個返回類型(對於C#也是如此)。因此,您需要同時處理SomeNone兩種情況,並使這兩種情況下的函數返回相同類型。然而,有時候,「同一類型」可能是另一個歧視聯盟。

從你的問題的措辭,這聽起來像你想在這兩種情況下返回一些卡,所以也許返回卡的列表:

let getHand = function 
    | Some(card1, card2) -> [card1; card2] 
    | None -> [] 

在這裏,我又回到在一個空列表None大小寫,但如果您願意,您可以使用默認列表填充返回值。

3

Mark Seemann的答案的另一種解決方案是也返回option。你可以寫(改變,因爲你自己的功能會變得微不足道):

let getFirstCard = function 
    | Some (card1, card2) -> Some card1 
    | None -> None 

或更好Option.map (fun (card1, card2) -> card1)

最後的(也是一般不好的)解決方案是使用Option.getNone上拋出異常。

相關問題