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

4

是否可以使用成员约束在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
1个回答

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的静态方法,类型为: 'a -> bool


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接