使用类型约束的F#模式匹配

时间:2016-04-20 17:02:03

标签: f# pattern-matching type-constraints

是否可以使用成员约束来执行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

两者都没有。

1 个答案:

答案 0 :(得分:5)

你不能这样做,正如Petr所说,静态解析的类型参数在编译时被解析。它们实际上是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的静态方法,其类型为sig:'a -> bool