Я не могу придумать хороший способ сделать это, так как вы не можете по-настоящему параметризировать или «подклассить» дискриминационный союз. Вы могли бы использовать несколько грязный хак с отражением, но я не совсем уверен, что это целесообразно (как и в большинстве случаев, связанных с отражением в рабочем коде).
type IArgParserTemplate =
abstract member Usage : string
type IArgumentDescription =
abstract member FirstDescription: string
// The parentheses are important to make this a class, not an interface
type ImportArguments() =
interface IArgumentDescription with
member this.FirstDescription = "Import Description"
// The parentheses are important to make this a class, not an interface
type ExportArguments() =
interface IArgumentDescription with
member this.FirstDescription = "Export Description"
type Arguments<'T when 'T :> IArgumentDescription> = | FirstArgument of string
with
interface IArgParserTemplate with
member this.Usage =
// Here's your instance of 'T
let instance = Activator.CreateInstance<'T>()
match this with
| FirstArgument _ -> instance.FirstDescription