2016-04-20 4 views
3

Возможно ли использовать тестовый шаблон F # типа с ограничением на член?
Такие, как:F # сопоставление шаблонов с использованием ограничений типа

let f x = 
    match x with 
    | :? (^T when ^T : (static member IsInfinity : ^T -> bool)) as z -> Some z 
    | _ -> None 

или

let g x = 
    match x with 
    | (z : ^T when ^T : (static member IsInfinity : ^T -> bool)) -> Some z 
    | _ -> None 

Ни которые работают.

+6

Нет, это не возможно. Параметры статически разрешенных типов должны быть разрешены во время компиляции – Petr

ответ

5

Вы не можете сделать это, как сказал Петр, параметры статического разрешения задаются во время компиляции. На самом деле это функция компилятора F #, а не функция .NET, поэтому почему эта информация недоступна во время выполнения.

Если вы хотите проверить это во время выполнения, вы можете использовать отражение.

let hasIsInfinity (x : 'a) = 
    typeof<'a>.GetMethod("IsInfinity", [|typeof<'a>|]) 
    |> Option.ofObj 
    |> Option.exists (fun mi -> mi.ReturnType = typeof<bool> && mi.IsStatic) 

Это будет проверять статический метод, называемый IsInfinity с типом сиг: 'a -> bool

Смежные вопросы