jkane
jkane

Reputation: 51

F# pattern match using type constraints

Is it possible to do an F# type test pattern with a member constraint?
Such as:

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

or

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

Neither which work.

Upvotes: 4

Views: 285

Answers (1)

TheInnerLight
TheInnerLight

Reputation: 12184

You cannot do this, as Petr said, statically resolved type parameters are resolved at compile time. They're actually a feature of the F# compiler rather than being a .NET feature, hence why this kind of information isn't available at runtime.

If you wish to check this at runtime, you could use reflection.

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

This will check for a static method called IsInfinity with type sig: 'a -> bool

Upvotes: 5

Related Questions