F# 函数参数中的泛型模式匹配

F# 函数参数中的泛型模式匹配,f#,F#,假设我有三种类型的DU和一个函数,它接受DU作为参数: type A = decimal<p> type B = decimal<p> type C = decimal<p> type ABC = A of A | B of B | C of C let myfunc (val: ABC) = match val with | A v -> ... | B v

假设我有三种类型的DU和一个函数,它接受DU作为参数:

    type A = decimal<p>
    type B = decimal<p>
    type C = decimal<p>

    type ABC = A of A | B of B | C of C

    let myfunc (val: ABC) = 
        match val with
        | A v -> ...
        | B v -> ...
        | C v -> ...
我希望它是这样的:

    let myfunc2 (val: A|B) = 
        match val with
        | A v -> ...
        | B v -> ...

您要求的语言特性是开放变体,它存在于OCaml中,但不存在于F#中。比如说,

type ABC = A of int | B of int | C of int
type AB  = A of int | B of int 

let myfunc (x: AB) = ...
在OCaml中是合法的。这也可以通过类型擦除DU()实现

F#中的DU case不是实际的类型,而是基本类型(
ABC
),带有一个标记,指示它是哪个联合大小写。由于没有单独存在的类型,因此它们不能用作类型约束


但是,您可以尝试使用
选项解决此问题。其想法是构建单案例DU,然后将它们与
选择
组合

类型A=A的整数
类型B=int的类型B
C型=整数的C型
类型ABC=选择
AB型=选择
让matchAb(x:AB)=
将x与
|选择1OF2(A)->A
|选择2of2(B)->B
type ABC = A of int | B of int | C of int
type AB  = A of int | B of int 

let myfunc (x: AB) = ...
type A = A of int
type B = B of int
type C = C of int

type ABC = Choice<A, B, C>
type AB  = Choice<A, B>

let matchAb (x: AB) =
    match x with
    | Choice1Of2 (A a) -> a
    | Choice2Of2 (B b) -> b