这个'或'模式的两面绑定不同的变量集?

时间:2015-07-29 20:14:58

标签: f#

以下代码尝试合并两个匹配案例NoneSome s when s <= aDate(如果日期为无或日期&lt; = aDate,请执行“第1部分”)。

match date with
| None 
| Some s when s <= aDate -> 
    ..... // Part 1
| _ -> 
    .....

然而它出错了吗?如何避免两次重写“第1部分”?

  

这个'或'模式的两面绑定不同的变量集

以下代码有效。

match date with
| None ->
    ..... // Part 1
| Some s when s <= aDate -> 
    ..... // repeat Part 1
| _ -> 
    .....

3 个答案:

答案 0 :(得分:6)

我认为你不能这样做,原因是编译器错误解释了。

但是,您应该能够使用active pattern

解决重复问题
let (|IsPart1|_|) aDate candidate =
    match candidate with
    | None -> Some ()
    | Some s when s <= aDate -> Some ()
    | _ -> None

这将使您能够编写如下函数:

let foo date aDate =
    match date with
    | IsPart1 aDate -> "Part 1"
    | _ -> "Part 2"

以下是一些FSI用法示例:

> let aDate = DateTime(2015, 7, 29);;    
val aDate : DateTime = 29.07.2015 00:00:00    
> foo None aDate;;
val it : string = "Part 1"
> foo (Some (DateTime(2011, 1, 1))) aDate;;
val it : string = "Part 1"
> foo (Some (DateTime(2015, 7, 30))) aDate;;
val it : string = "Part 2"

答案 1 :(得分:3)

在这种特殊情况下,你也可以反转&#39;分支机构:

match date with
| Some s when s > aDate -> 
    .....
| _ -> 
    ..... // Part 1

答案 2 :(得分:-2)

你刚刚忘记了箭头 - &gt;在无案例中

InputStreamReader