1

我是 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

注意:我正在拆分一个数字范围(范围以字符串表示),然后创建表示范围最小值和最大值的整数值。

4

1 回答 1

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(success) 或None(failure) 并且程序的其余部分可以稍后基于此做出决定。

于 2010-05-13T19:10:23.687 回答