以下代码尝试合并两个匹配案例None
和Some 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
| _ ->
.....
答案 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