2012-08-05 3 views
4

안녕하세요 다음 코드를 작성했습니다.F # 패턴 when 절과 일치시키기

내 목표는 명령 줄 매개 변수가 1 요소가있는 배열이고 해당 요소가 정수인지 확인하는 getWoeid라는 함수를 작성하는 것이 었습니다.

내 코드가 작동하지만 ... 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 

답변

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 
7

당신은 대신이 tuplized 수 있도록의 TryParse로하는 ByRef 매개 변수를 전달할 수 있습니다.

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