F# 函数参数中的泛型模式匹配
假设我有三种类型的DU和一个函数,它接受DU作为参数: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
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