模式匹配守卫与DateTime.TryParseExact?

ca9*_*3d9 1 f# guard-clause

如何防范DateTime.TryParseExact(并在可能的情况下获得解析的值)?以下代码不起作用.

[<EntryPoint>]
let main args =
    let argList = args |> List.ofSeq
    match argList with
    | "aaa" :: [] -> aaa.main "aaa"
    | "bbb" :: [] -> bbb.main "bbb"
    | "ccc" :: yyyymm :: [] when DateTime.TryParseExact
              (yyyymm, "yyyyMM", CultureInfo.InvariantCulture, DateTimeStyles.None)-> 
        ccc.main "ccc" yyyymm
Run Code Online (Sandbox Code Playgroud)

Dan*_*iel 7

你可以使用mutable:

let mutable dt = Unchecked.defaultof<_>
match argList with
| "ccc" :: yyyymm :: [] when 
    DateTime.TryParseExact(yyyymm, 
                           "yyyyMM", 
                           CultureInfo.InvariantCulture, 
                           DateTimeStyles.None, 
                           &dt) -> ...
Run Code Online (Sandbox Code Playgroud)

但是一个活跃的模式使匹配更加清晰:

let (|DateTimeExact|_|) (format: string) s =
    match DateTime.TryParseExact(s, format, CultureInfo.InvariantCulture, DateTimeStyles.None) with
    | true, d -> Some d
    | _ -> None

match argList with
| "ccc" :: DateTimeExact "yyyyMM" yyyymm :: [] -> ...
Run Code Online (Sandbox Code Playgroud)