主动模式匹配与歧视联盟

Active Pattern Matching with Discriminated Unions

有什么方法可以使用以下形式的可区分联合和主动模式匹配吗?我找不到任何示例。

这就是我想要做的事情:

type c = a | b

type foo =
  | bar1
  | bar2 of c

//allowed
let (|MatchFoo1|_|) aString =
  match aString with
  | "abcd" -> Some bar1
  | _ -> None

//not allowed
let (|MatchFoo2|_|) aString =
  match aString with
  | "abcd" -> Some (bar2 of a)
  | _ -> None

为什么"Some"不能用第二种方式?有没有其他方法可以达到同样的效果?

你只需要在声明类型时使用 of ,所以你可以只使用 bar2 构造函数构造值,例如:

bar2 a

如果您将第二个函数更改为:

,您的第二个函数应该可以工作
let (|MatchFoo2|_|) aString =
  match aString with
  | "abcd" -> Some (bar2 a)
  | _ -> None