2011-05-18 59 views
5

我有一个通用函数,它很容易让编译器推断出错误的类型参数。类型参数只控制返回类型,如果我意外错过了类型注释,编译器推断obj强制显式类型参数

如何在不给出明确的类型参数的情况下调用我的函数来使其成为编译时错误?该Unchecked.defaultof功能的工作原理,我想顺便说一句:

> Unchecked.defaultof;; 

    Unchecked.defaultof;; 
    ^^^^^^^^^^^^^^^^^^^ 

stdin(1,1): error FS0685: The generic function 'defaultof' must be given explicit type argument(s) 

回答

10

defaultof函数使用一个特殊的属性。 F#源代码再次有用。该函数的实现在prim-types.fs中,但该属性被添加到接口文件prim-types.fsi中。合并声明将是:

[<RequiresExplicitTypeArguments>] 
let inline unsafeDefault<'T> : 'T = (# "ilzero !0" type ('T) : 'T #) 

内联IL (# ... #)仅限于F#的核心,但申报的东西任何人都可以使用。

,可以看到在第16(第217页)的F# specification的属性:

当应用于F#函数或方法,表示使用时的函数或方法,必须给予明确的类型的参数。例如,typeof<int>。 该属性只能用于F#程序集。

+0

感谢Tomas - 我正在寻找在prim-types.fs中的实现,而不是在prim-types.fsi中的签名。 – 2011-05-18 10:14:29

+0

@Tim - 我也是首先查看'fs'文件。我花了一些时间才发现它实际上可以在'fsi'文件中:-) – 2011-05-18 10:19:06