在 F# 中是否可以同时基于类型和值来区分联合?
这是在不知道语法应该是什么样子的情况下表达这一点的尝试。
type Foo =
| A of int * Foo
| B of string where B.name = "1" * Foo
| C of string where C.name = "2" * Foo
| Empty
在 F# 中是否可以同时基于类型和值来区分联合?
这是在不知道语法应该是什么样子的情况下表达这一点的尝试。
type Foo =
| A of int * Foo
| B of string where B.name = "1" * Foo
| C of string where C.name = "2" * Foo
| Empty
我不完全确定您要达到的目标。但是,如果你想创建一个类型,name
当它是“1”,B
当它是“2” C
,那么你可以添加一个成员:
type Foo =
| A of int * Foo
| B of Foo
| C of Foo
| Empty
member x.Name =
match x with
| B _ -> "1"
| C _ -> "2"
| _ -> failwith "Name is not available!"
如果您希望在模式匹配中使用数字,那么您可以定义一个活动模式。假设你有一个只有A
or的类型B
(它有一个名字):
type Foo =
| A of int
| B of string * Foo
A
现在您可以编写一个活动模式,让您区分B
名称为“1”和B
名称为“2”的 :
let (|A|B1|B2|) x =
match x with
| A n -> A n
| B("1", foo) -> B1 foo
| B("2", foo) -> B1 foo
| _ -> failwith "Invalid B"
如果你现在有一个 value foo
,你可以对这三种情况进行模式匹配:
match foo with
| A n -> ...
| B1 subfoo -> ...
| B2 subfoo -> ...