F# 为什么我必须为None返回一个类型化的值?
为什么我必须为None返回一个类型化的值F# 为什么我必须为None返回一个类型化的值?,f#,F#,为什么我必须为None返回一个类型化的值 let getHand = function | Some(card1, card2) -> card1, card2 | None -> // ? 就我而言,我想帮你一把。但是,如果通过期权不存在手牌,那么我仍然进行手牌交易是没有意义的 我没有考虑什么? 我应该使用什么模式 具体地说,如果没有人手,那么我想抓一整副牌。 如果不存在结果,为什么方法会产生复杂类型的结果 | None -> // Why am I sti
let getHand = function
| Some(card1, card2) -> card1, card2
| None -> // ?
就我而言,我想帮你一把。但是,如果通过期权不存在手牌,那么我仍然进行手牌交易是没有意义的
我没有考虑什么?
我应该使用什么模式
具体地说,如果没有人手,那么我想抓一整副牌。
如果不存在结果,为什么方法会产生复杂类型的结果
| None -> // Why am I still required to yield a typed result
F#中的所有值都有类型。函数也可以
getHand
函数看起来像是将一个选项
值作为输入。由于选项
值是一个有区别的并集,因此函数必须处理两种可能输入的情况。编译器和类型系统可以帮助您完成这项工作
函数类型的一部分是其返回值。在F#中,函数只能有一个返回类型(C#也是如此)。因此,您需要处理Some
和None
两种情况,并使函数在这两种情况下返回相同的类型。不过,有时候,这种“同一类型”可能是另一种歧视性的联盟
从你问题的措辞来看,这两种情况下,听起来你都想退回一些卡片,因此,或许可以退回卡片列表:
let getHand = function
| Some(card1, card2) -> [card1; card2]
| None -> []
在这里,我在None
案例中返回了一个空列表,但是如果您愿意,可以用默认列表填充返回值。F#中的所有值都有类型。函数也可以
getHand
函数看起来像是将一个选项
值作为输入。由于选项
值是一个有区别的并集,因此函数必须处理两种可能输入的情况。编译器和类型系统可以帮助您完成这项工作
函数类型的一部分是其返回值。在F#中,函数只能有一个返回类型(C#也是如此)。因此,您需要处理Some
和None
两种情况,并使函数在这两种情况下返回相同的类型。不过,有时候,这种“同一类型”可能是另一种歧视性的联盟
从你问题的措辞来看,这两种情况下,听起来你都想退回一些卡片,因此,或许可以退回卡片列表:
let getHand = function
| Some(card1, card2) -> [card1; card2]
| None -> []
在这里,我在
None
案例中返回了一个空列表,但是如果您愿意,您可以用默认列表填充返回值。Mark Seemann的答案的另一个解决方案是也返回选项。您可以编写(更改是因为您自己的函数将变得微不足道):
或者更好
最后一个(通常是坏的)解决方案是使用对None
抛出异常。Mark Seemann回答的另一个解决方案是也返回选项。您可以编写(更改是因为您自己的函数将变得微不足道):
或者更好
最后(通常是糟糕的)解决方案是使用在None
上抛出异常