2010-05-13 33 views
1

我新的F#和我有這樣的代碼:如何使用此F#示例中的Some/None選項?

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 

注:我分裂了一系列的數字(範圍在字符串來表示),然後創建表示範圍的最小值和最大值的整數值。

回答

4

匹配不是不必要的,字符串可能是「1-2-3」,你會得到一個三元素數組。

退出試圖擺脫這場比賽,這是你的朋友,而不是你的敵人。 :)你的敵人是錯誤的預驗證嘗試(「如果包含」邏輯,這是錯誤的)。

我想你可能會喜歡這個由兩部分組成的博客系列。

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

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

編輯

關於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(失敗)和程序的其餘部分可以做一個十進制後來基於此的ision。

+0

良好的通話,謝謝:) – Phobis 2010-05-13 19:11:13

+0

我只是不想返回0,0,但我想要返回代碼來處理失敗,如果有一個。我不知道如何使用Some/None ...這是我可以使用它的地方嗎?我想告訴調用者它或者成功了一些值,或者它沒有成功。 – Phobis 2010-05-13 19:13:28

+0

使用你的Some/None的例子,我可以這樣做嗎?讓x,y =例子「1-2」?我如何使用Some/None值? – Phobis 2010-05-13 22:00:15