内部函数的F#泛型

时间:2014-03-30 14:05:22

标签: f#

我有以下代码:

type IQuery = 
    abstract List<'T> : unit -> IList<'T>


let create (str)=
   let getList () : IList<'T> = upcast List<'T>()
   { new IQuery with
      member this.List<'T>() = getList<'T>()

对于最后一行,它给了我一个警告,说明:

方法或函数'getList'不应该给出显式类型参数,因为它没有显式声明其类型参数

但是,如果我删除&lt;'T&gt;从getList调用然后我得到一个编译错误:

成员'List&lt;'T&gt; :unit - &gt;的IList&LT; '一&GT;'没有正确的类型来覆盖相应的抽象方法。所需的签名是'List&lt;'T&gt; :unit - &gt;的IList&LT; 'T&GT;'。

我该怎么办?

1 个答案:

答案 0 :(得分:2)

您可以使用显式类型参数声明getList

let getList<'T> () : IList<'T> = upcast List<'T>()

然后您收到错误:

  

显式类型参数只能用于模块或成员绑定

如果您将let绑定移动到与type相同范围的顶级,则一切正常:

type IQuery = 
    abstract List<'T> : unit -> IList<'T>

let getList<'T> () : IList<'T> = upcast List<'T>()

let create (str) =
       { new IQuery with
          member this.List<'T>() = getList<'T>()
       }

如果您的真实代码getList仅使用create范围内的值,例如str,则您需要将它们作为显式参数添加到getList