是否可以在 F# 中以类型安全的方式为任意代数数据类型自动生成谓词和访问器?
例如,如果我们有用户定义的类型:
type A =
B of string
| C of int * sting
应该生成这样的东西:
type A =
B of string
| C of int * sting
with
member __.isB = match __ with B -> true | _ -> false
member __.isC = match __ with C -> true | _ -> false
member __._1 = match __ with B(x) -> Some(x) | _ -> None
member __._2 = match __ with C(x,_) -> Some(x) | _ -> None
member __._3 = match __ with C(_,x) -> Some(x) | _ -> None
如果可以为访问器指定名称可能带有这样的注释会更好:
[<GenerateAccessors(["BName", "CName", "Value"])>]
如果我想简化对内部数据的访问,可能无法完成,或者我应该使用记录而不是区分联合(DU)。但是使用 DU 的模式匹配更简单,我希望同时获得这两个好处 - 简单的模式匹配和简单的“直接数据访问”。