Чтобы немного расширить пример Роберта - даже если у вас нет экземпляра распознаваемого объединения, вы можете использовать отражение F #, чтобы получить информацию о типе (например, типах * 1004).* аргументов отдельных случаев).Следующий пример расширяет пример Роберта и выводит типы аргументов:
open Microsoft.FSharp.Reflection
let ty = typeof<option<int>>
let cases = FSharpType.GetUnionCases ty
printfn "type %s =" ty.FullName
for case in cases do
printf "| %s" case.Name
let fields = case.GetFields()
if fields.Length > 0 then
printf " of"
for fld in fields do
printf " %s " fld.PropertyType.FullName
printfn ""
Например, для типа option<int>
вы получите (я немного упростил вывод):
type Microsoft.FSharp.Core.FSharpOption`1[System.Int32] =
| None
| Some of System.Int32
Существует много интересных применений этой информации - например, вы можете сгенерировать схему БД из объединений F # или создать функции, которые будут анализировать XML в различимое объединение (которое описывает структуру).Я говорил об образце обработки XML на конференции GOTO ранее в этом году .