内部函数的 F# 泛型

标签 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”方法或函数指定显式类型参数,因为它没有显式声明其类型参数

但是,如果我从 getList 调用中删除 <'T>,则会出现编译错误:

成员 'List<'T> : unit -> IList<'a>' 没有覆盖相应抽象方法的正确类型。所需的签名是 'List<'T> : unit -> IList<'T>'。

我能做什么?

最佳答案

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

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

然后你会得到一个错误:

Explicit type parameters may only be used on module or member bindings

如果您随后将 let 绑定(bind)移动到与 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 的参数。

关于内部函数的 F# 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22744930/

相关文章:

json - 带有 Fleece 的适当 JsonObjCodec,用于复杂的嵌套可区分联合

f# - 为什么 F# 中没有 protected 访问修饰符?

.net - F# - 将 100 个对象创建到一个列表中 - 最实用和惯用的方式

F# 签名文件 - 定义构造函数参数

asynchronous - F#- AsyncSeq - 如何返回列表中的值

datetime - F#,小类型推断/注释错误

.net - F# 是 .net windows 开发的可用语言吗

php - 从 php 调用 F# (.Net dll) 代码

f# - F# 函数名称和指向该名称的函数值之间的区别

f# - 区分带有可选参数的 f# 重载函数