Как говорит существующий ответ, вам не нужно явно повторять ограничение в сигнатуре типа, потому что компилятор F # может вывести его. Еще один способ дальнейшего выделения кода, который включает ограничение типа, состоит в том, чтобы просто иметь функцию tryParse
, которая вызывает метод TryParse
(и имеет ограничение типа), а затем вызывать эту функцию из вашего tryParseWithDefault
.
Таким образом, вы отделяете «основную» логику вызова члена от любой дополнительной логики. Когда вы делаете это, вам снова не нужно повторять ограничение, потому что компилятор выводит его:
let inline tryParse text =
let mutable r = Unchecked.defaultof<_>
(^a : (static member TryParse: string * ^a byref -> bool) (text, &r)), r
let inline tryParseWithDefault (defaultVal:'a) text =
match tryParse text with
| true, v -> v
| _ -> defaultVal