f# - 这个 'or' 模式的两侧绑定(bind)了不同的变量集?

标签 f#

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

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

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

The two sides of this 'or' pattern bind different sets of variables



以下代码有效。
match date with
| None ->
    ..... // Part 1
| Some s when s <= aDate -> 
    ..... // repeat Part 1
| _ -> 
    .....

最佳答案

我认为您不能这样做,原因由编译器错误解释。

但是,您应该能够使用 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"

关于f# - 这个 'or' 模式的两侧绑定(bind)了不同的变量集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31710260/

相关文章:

f# - 在 FsCheck 中,如何生成非负字段的测试记录?

f# - 将 C# 异步方法转换为 F# 函数

visual-studio - 如何更改 F# 交互式 shell 的颜色

forms - F# 将按钮列表添加到表单控件范围

parsing - 如何解析 FParsec 中的同类列表?

f# 克隆记录数据

data-structures - 来自第一个元素列表数据结构的功能 O(1) 追加和 O(n) 迭代

F#.Data HTML 解析器从节点提取字符串

recursion - F# Powerset 函数

visual-studio-2013 - 为什么 F# 库没有 dll 版本?