Ограничения членов F # + ^ a byref parameters

После некоторой игры с функцией ограничений членов 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>

I пытаюсь написать другую функцию tryParse , который использует статический метод TryParse и переносит результат синтаксического анализа в 'тип 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> но здесь есть тип 'ссылка

F # ref -cells тоже не работает:

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

Что я делаю не так?

8
задан controlflow 11 January 2011 в 11:00
поделиться