Как использовать некоторые / нет параметры в этом примере F #? - PullRequest
1 голос
/ 13 мая 2010

Я новичок в F # и у меня есть этот код:

if s.Contains("-") then
    let x,y =
      match s.Split [|'-'|] with
      | [|a;b|] -> int a, int b
      | _ -> 0,0

Обратите внимание, что мы проверяем, что в строке есть «-», прежде чем мы разбиваем строку, поэтому совпадение действительно не нужно. Могу ли я переписать это с параметрами?

Я изменил этот код, изначально он был (но я получал предупреждение):

if s.Contains("-") then
    let [|a;b|] = s.Split [|'-'|] 
    let x,y = int a, int b

ПРИМЕЧАНИЕ. Я разбиваю диапазон чисел (диапазон выражается в строке), а затем создаю целочисленные значения, представляющие минимум и максимум диапазона.

1 Ответ

4 голосов
/ 13 мая 2010

Совпадение не является ненужным, строка может быть "1-2-3", и вы получите массив из трех элементов.

Перестань пытаться избавиться от матча, это твой друг, а не враг. :) Ваш враг - ошибочная попытка предварительной проверки (логика «если содержит», которая была неправильной).

Думаю, вам понравится эта серия блогов, состоящая из двух частей.

http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!180.entry

http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!181.entry

EDIT

По поводу Some / None комментария, да, вы можете сделать

let parseRange (s:string) =
    match s.Split [|'-'|] with 
    | [|a;b|] -> Some(int a, int b)
    | _ -> None

let Example s =
    match parseRange s with
    | Some(lo,hi) -> printfn "%d - %d" lo hi
    | None -> printfn "range was bad"

Example "1-2"
Example "1-2-3"
Example "1"

, где возвращаемое значение parseRange равно Some (успех) или None (сбой), и остальная часть программы может принять решение позже на основе этого.

...