推断类型的主动识别器 - 一个是选项,另一个不是

时间:2013-12-13 00:44:56

标签: f#

我有以下代码。对于最后两个match,第一个period的类型为DateTime option,第二个int的类型为let (|Integer|_|) (str: string) = let mutable intvalue = 0 if Int32.TryParse(str, &intvalue) then Some(intvalue) else None let (|DateyyMM|) (str: string) = let mutable date = new DateTime() if DateTime.TryParseExact(str, "yyyyMM", Globalization.DateTimeFormatInfo.InvariantInfo, Globalization.DateTimeStyles.None, &date) then Some(date) else None let (|ParseRegex|_|) regex str = let m = Regex(regex).Match(str) if m.Success then Some (List.tail [ for x in m.Groups -> x.Value ]) else None ..... match url with | ParseRegex "....." [DateyyMM period] -> //period type is DateTime option ...... match downloadLink.Url with | ParseRegex "....." [name; Integer period] -> // period type is int ...... 。为什么第二个没有选项?

{{1}}

1 个答案:

答案 0 :(得分:3)

第二种情况没有选项,因为您在声明的末尾添加了_|

这是设置为允许匹配中的速记 - 而不是

match x with
|Some_long_function(Some(res)) -> ...
|Some_long_function(None) -> ...

你可以做到

match x with
|Some_long_function(res) -> ...
|_ -> ...

有关更多信息,请参阅活动模式的MSDN页面:http://msdn.microsoft.com/en-us/library/dd233248.aspx(特别是部分模式的部分)