我正在玩F#中的一些超载。
我有一个带有静态类型约束的函数,它指定^a
类型应该有f
类型的静态成员unit -> ^a
。
我还希望我的函数能够使用本机类型,但由于它们没有该成员,并且因为静态约束不适用于类型扩展,所以我采用了一些hackery。这就是我所做的。
let inline gInternal< ^a, ^b when (^a or ^b) : (static member f : ^a -> ^a)> (b : ^b) : ^a
= ((^a or ^b) : (static member f: ^a -> ^a) (Unchecked.defaultof< ^a>))
let inline g() : ^a = gInternal Default
此处,Default
是Default
类型的对象,定义如下
type Default =
| Default
static member f(_ : unit) = ()
static member f(_ : int) = 0
我有点惊讶这实际上有效,但现在我有一个不同的问题。
我想为这个模块制作一个签名文件。不幸的是,g
的签名变得无法编写。
它的类型应该是
val g< ^a when (^a or Default) : (static member f: ^a -> ^a)> : unit -> ^a
但^a or Default
部分在语法上无效。
有没有其他方式来表达这个?