我有以下代码。对于最后两个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}}
答案 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(特别是部分模式的部分)