我正在尝试使用可区分联合的特定成员作为参数类型。例如:
type SomeUnion =
| A of int * int
| B of string
type SomeType(A(i, j)) =
member this.I = i
member this.J = j
let a = A(10, 20)
let instance = SomeType(a)
但这是非法语法,并在 SomeType 的参数列表中出现“类型定义中的意外符号 '('”。这是有效的语法:
let doSomethingWithA (A(i, j)) = i + j
但是类型签名SomeUnion -> int
不是A -> int
,它抱怨不完整的模式匹配(给定签名可以理解)。
那么这可能吗?我相信 F# 联合成员被编译为 CLR 类,所以理论上似乎可行,但实际上是否可行(即不使用反射之类的东西)?否则我想你必须做更冗长的手动 OOP 方式,并且不能保证完全匹配。