Шаблон F# Соответствует предложению when

Здравствуйте, я написал следующий код.

Моей целью было написать функцию 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 ответа

Решение

Вы можете определить активный шаблон:

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

Вы также можете передать параметр byref TryParse вместо того, чтобы позволить этому быть tuplized.

let getWoeid args = 
  let mutable i = 0
  match args with
  | [|s|] when Int32.TryParse(s, &i) -> Some i
  | _ -> None
Другие вопросы по тегам