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

ca9*_*3d9 2 f#

以下代码尝试组合两个匹配案例NoneSome s when s <= aDate(如果日期为无或日期<= aDate,则为"部分1").

match date with
| None 
| Some s when s <= aDate -> 
    ..... // Part 1
| _ -> 
    .....
Run Code Online (Sandbox Code Playgroud)

但它得到错误?如何避免两次重写"第1部分"?

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

以下代码有效.

match date with
| None ->
    ..... // Part 1
| Some s when s <= aDate -> 
    ..... // repeat Part 1
| _ -> 
    .....
Run Code Online (Sandbox Code Playgroud)

Mar*_*ann 6

由于编译错误所解释的原因,我认为你不能这样做.

但是,您应该能够使用活动模式解决重复问题:

let (|IsPart1|_|) aDate candidate =
    match candidate with
    | None -> Some ()
    | Some s when s <= aDate -> Some ()
    | _ -> None
Run Code Online (Sandbox Code Playgroud)

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

let foo date aDate =
    match date with
    | IsPart1 aDate -> "Part 1"
    | _ -> "Part 2"
Run Code Online (Sandbox Code Playgroud)

以下是一些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"
Run Code Online (Sandbox Code Playgroud)