主动模式匹配与歧视联盟
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
有什么方法可以使用以下形式的可区分联合和主动模式匹配吗?我找不到任何示例。
这就是我想要做的事情:
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