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

标签 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

无论哪个工作。

最佳答案

您不能这样做,正如 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

关于使用类型约束的 F# 模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36750513/

相关文章:

haskell - 类型族实例中的类型级约束

TypeScript 无法在函数类型中派生类型约束

f# - 如何将从数据库返回的日期与日期(字符串或其他)进行比较?

postgresql - 通过F#和Npgsql调用Postgresql中的存储过程

compiler-errors - 无法确定 F# 函数中的对象类型

f# - OCaml 函数少传入一个参数

java - 获取字符串末尾没有小写字母的子字符串

f# - 新手 F# trie 实现出错

algorithm - 应该使用什么相似性度量来对这些序列进行分类?

f# - 试图理解推断的类型约束