如何在此F#示例中使用Some / None选项?

时间:2010-05-13 18:54:55

标签: f# options

我是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 个答案:

答案 0 :(得分: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(失败),程序的其余部分可以稍后根据该值做出决定。