F#Pattern匹配when子句

时间:2012-08-05 20:37:02

标签: f#

您好我已经写了以下代码。

我的目标是编写一个名为getWoeid的函数,它将检查命令行参数是否是一个包含1个元素的数组,并且该元素是一个整数。

我的代码有效......但是我两次调用TryParse方法......我想知道是否有一种方法可以只调用一次。

另外,您能否确认使用模式匹配来验证命令行参数的方式是否正确?

open System;
open System.Xml;

let getWoeid args =   
  let retVal = 0
  match args with      
  | [|a|] when fst (Int32.TryParse(a)) = true -> 
      printfn "%s" "Starting the processing for woeid "
      Some(snd (Int32.TryParse(a)))      
  | _ -> failwith "Usage XmlRead WOEID"       

[<EntryPoint>]
let main args = 
  let woeid= 
    try   
      getWoeid args          
    with
      | Failure (msg) -> printfn "%s" msg; None

  0

2 个答案:

答案 0 :(得分:12)

您可以定义活动模式:

let (|Int|_|) s = 
    match System.Int32.TryParse s with
    | true, v -> Some v
    | _ -> None

let getWoeid args = 
    match args with
    | [|Int v|] -> Some v
    | _ -> None

答案 1 :(得分:7)

您也可以将byref参数传递给TryParse,而不是让它被tuplized。

let getWoeid args = 
  let mutable i = 0
  match args with
  | [|s|] when Int32.TryParse(s, &i) -> Some i
  | _ -> None