判別共用体の特定のメンバーをパラメーターの型として使用しようとしています。例えば:
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 の param リストに対して「Unexpected symbol '(' in type definition」というエラーが表示されます。これは有効な構文です。
let doSomethingWithA (A(i, j)) = i + j
しかし、型シグネチャはSomeUnion -> int
ではなく でありA -> int
、不完全なパターン一致について不平を言っています (シグネチャを考えると理解できます)。
それで、これは可能ですか?F# のユニオン メンバーは CLR クラスにコンパイルされるので、理論的には可能と思われますが、実際には (つまり、リフレクションのようなものを使用せずに) 可能でしょうか? それ以外の場合は、より冗長な手動の OOP 方法を実行する必要があり、完全な一致を保証できないと思います。