值限制 - 已推断值具有泛型类型

Value restriction - The value has been inferred to have generic type

提问人:kimsagro 提问时间:4/13/2019 最后编辑:glennslkimsagro 更新时间:4/13/2019 访问量:461

问:

给出以下定义

let fn (id: int) (_:string) = id

我可以创建部分应用的函数

let fnPartial = fn 1

但是,将类型更改为非密封类型,例如_IEnumerable

let fn (id: int) (_:IEnumerable) = id

导致编译错误

值限制。据推断,值“fnPartial”具有 泛型类型 val fnPartial : ('_a -> int) when '_a :> IEnumerable 使“fnPartial”的参数显式化,或者,如果您不打算 要使它成为泛型,请添加类型注释。(使用内置 F# 编译器)

引发了一个错误,但关闭了以下响应

是的,这是设计使然 - IEnumerable 未在字符串所在的地方密封,并且 这会导致触发值限制

解决方法是添加类型注释

let fn (id: int) (_:IEnumerable ) = id
let fnPartial<'a> = fn 1

有人可以解释一下吗

  1. 问题的症结是什么
  2. 添加类型批注如何解决该问题
F# 多态性 值限制

评论


答:

2赞 Tyler Hartwig 4/13/2019 #1

关键是 F# 中不允许是泛型的。部分应用函数时,结果为一个值

为了使绑定(或赋值)的左侧成为函数,必须在左侧定义一个参数。

您遇到的错误是由于不够具体而无法完全定义的结果。假设您不知道要迭代的内容,因此编译器无法确定值的正确类型。IEnumerableIEnumerable

那么,您的问题的答案如下:

  1. 关键是问题在于值不能是泛型的
  2. 添加类型定义可以让编译器知道这不是一个值,而是一个函数,或者允许是泛型的东西。

下面是相关的 MSDN 文档:https://learn.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/dd233183(v=vs.100)#value 限制