Эта функция имеет подпись: (UnionCaseInfo -> bool) -> 'T option
Почему здесь требуется аннотация?
let private findCase<'T> f =
match FSharpType.GetUnionCases typeof<'T> |> Array.filter f with
|[|case|] -> Some (FSharpValue.MakeUnion(case,[||]) :?> 'T)
|_ -> None
Эта функция, которая вызывает описанную выше функцию, имеет подпись: int -> obj
let CreateFromId<'T> id =
match findCase (fun case -> case.Tag = id) with
| Some c -> c
| None -> failwith (sprintf "Lookup for union case by \"%d\" failed." id)
В шаблон для CreateFromId
, IntelliSense показывает, что c
выводится на иметь тип obj
, даже если он показывает правильную подпись для findCase
. Почему тип кажется «потерянным» в шаблоне?
(я могу обойти это, указав тип возвращаемого CreateFromId
к 'T
)
Это имеет смысл. Я думаю, что мне нужно иметь параметр типа, потому что это требует «FSharpType.GetUnionCases». –