После некоторой игры вокруг функции ограничений членов F # и функции записи, подобной этой:
let inline parse< ^a when ^a : (static member Parse: string -> ^a) > s =
(^a: (static member Parse: string -> ^a) s)
Это прекрасно работает:
let xs = [ "123"; "456"; "999" ] |> List.map parse<int>
Я пытаюсь написать другую функцию tryParse
, которая использует статический метод TryParse
и оборачивает результат анализа в тип 'a option
для лучшей поддержки в F #. Что-то вроде этого не компилируется:
let inline tryParse s =
let mutable x = Unchecked.defaultof< ^a>
if (^a: (static member TryParse: string * ^a byref -> bool) (s, &x))
then Some x else None
Ошибка:
ошибка FS0001: это выражение было
ожидается, чтобы иметь тип
byref <'a> но здесь есть тип
'ref
F # ref
-клетки тоже не работают:
let inline tryParse s =
let x = ref Unchecked.defaultof< ^a>
if (^a: (static member TryParse: string * ^a byref -> bool) (s, x))
then Some x else None
Что я делаю не так?