为什么我被迫返回None的类型值?

时间:2015-12-07 12:41:31

标签: f#

为什么我被迫返回None的类型值?

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

在我的情况下,我想交手。但是如果通过选项不存在任何牌,我仍然没有意义。

我不考虑什么? 我应该使用什么模式?

具体来说,如果没有牌,那么我想抓住一个完整的牌组。 如果没有结果,为什么方法会产生复杂的类型结果?

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

2 个答案:

答案 0 :(得分:9)

F#中的所有值都有类型。功能也可以。

getHand函数看起来像输入一个option值。由于option值是一个区分联盟,因此该函数必须解决两种可能的输入问题。编译器和类型系统可以帮助您实现这一目标。

函数类型的一部分是它的返回值。在F#中,函数只能有一个返回类型(C#也是如此)。因此,您需要同时解决SomeNone情况,并使函数在两种情况下都返回相同的类型。但有时,相同的类型'可以是另一个被歧视的联盟。

从问题的措辞来看,听起来你想要在两种情况下都返回一些卡片,所以可能会返回一张卡片列表:

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

在这里,我在None案例中返回了一个空列表,但如果您愿意,您可以使用默认列表填充返回值。

答案 1 :(得分:3)

Mark Seemann的另一个解决方案是回复option。你可以写(改变因为你自己的功能会变得微不足道):

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

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

最终(通常是坏的)解决方案是使用Option.getNone上抛出异常。