2016-04-20 5 views
3

Ist es möglich, ein Testmuster vom Typ F # mit einer Elementeinschränkung zu erstellen?
Wie zum Beispiel:F # -Musterübereinstimmung unter Verwendung von Typeinschränkungen

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

oder

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

Weder die Arbeit.

+6

Nein, es ist nicht möglich. Statisch aufgelöste Typparameter müssen zum Zeitpunkt der Kompilierung aufgelöst werden – Petr

Antwort

5

Sie können dies nicht tun, wie Petr sagte, statisch aufgelöste Typparameter werden zur Kompilierzeit aufgelöst. Sie sind eher eine Funktion des F # -Compilers als eine .NET-Funktion, weshalb diese Art von Informationen zur Laufzeit nicht verfügbar ist.

Wenn Sie dies zur Laufzeit überprüfen möchten, können Sie reflection verwenden.

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

Dies wird für eine statische Methode IsInfinity mit Typ-sig genannt überprüfen: 'a -> bool

Verwandte Themen