值限制 - 值已被推断为具有通用类型
Value restriction - The value has been inferred to have generic type
给出如下定义
let fn (id: int) (_:string) = id
我可以创建一个部分应用的函数
let fnPartial = fn 1
但是将 _
的类型更改为非密封类型,例如 IEnumerable
let fn (id: int) (_:IEnumerable) = id
导致编译错误
Value restriction. The value 'fnPartial' has been inferred to have
generic type
val fnPartial : ('_a -> int) when '_a :> IEnumerable Either make the arguments to 'fnPartial' explicit or, if you do not intend
for it to be generic, add a type annotation. (using built-in F#
compiler)
A bug was raised 但以以下响应结束
Yes this is by design - IEnumerable is not sealed where string is, and
this causes the value restriction to trigger
解决方法是添加类型注释
let fn (id: int) (_:IEnumerable ) = id
let fnPartial<'a> = fn 1
谁能解释一下
- 问题的关键是什么
- 添加类型注释如何解决问题
关键是 值 在 F# 中不允许是通用的。当您部分应用 function 时,结果是 value.
为了使绑定(或赋值)的左侧成为一个函数,您必须在左侧定义一个参数。
您收到的错误是由于 IEnumerable
不够具体,无法完全定义 value。鉴于 IEnumerable
你不知道你在迭代什么,因此编译器无法确定该值的正确类型。
那么您的问题的答案如下:
- 问题的症结在于值不能是通用的
- 添加类型定义让编译器知道这不是一个值,而是一个函数,或者是允许泛型的东西。
这是相关的 MSDN 文档:
https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/dd233183(v=vs.100)#value-restriction
给出如下定义
let fn (id: int) (_:string) = id
我可以创建一个部分应用的函数
let fnPartial = fn 1
但是将 _
的类型更改为非密封类型,例如 IEnumerable
let fn (id: int) (_:IEnumerable) = id
导致编译错误
Value restriction. The value 'fnPartial' has been inferred to have generic type val fnPartial : ('_a -> int) when '_a :> IEnumerable Either make the arguments to 'fnPartial' explicit or, if you do not intend for it to be generic, add a type annotation. (using built-in F# compiler)
A bug was raised 但以以下响应结束
Yes this is by design - IEnumerable is not sealed where string is, and this causes the value restriction to trigger
解决方法是添加类型注释
let fn (id: int) (_:IEnumerable ) = id
let fnPartial<'a> = fn 1
谁能解释一下
- 问题的关键是什么
- 添加类型注释如何解决问题
关键是 值 在 F# 中不允许是通用的。当您部分应用 function 时,结果是 value.
为了使绑定(或赋值)的左侧成为一个函数,您必须在左侧定义一个参数。
您收到的错误是由于 IEnumerable
不够具体,无法完全定义 value。鉴于 IEnumerable
你不知道你在迭代什么,因此编译器无法确定该值的正确类型。
那么您的问题的答案如下:
- 问题的症结在于值不能是通用的
- 添加类型定义让编译器知道这不是一个值,而是一个函数,或者是允许泛型的东西。
这是相关的 MSDN 文档: https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/dd233183(v=vs.100)#value-restriction