无法写出正确的类型签名

时间:2015-04-07 14:15:00

标签: f#

我正在玩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

此处,DefaultDefault类型的对象,定义如下

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部分在语法上无效。 有没有其他方式来表达这个?

0 个答案:

没有答案