值限制错误详情

Posted

技术标签:

【中文标题】值限制错误详情【英文标题】:value restriction error details 【发布时间】:2017-05-22 06:15:07 【问题描述】:
let empties = Array.create 100 []

给出值限制错误: error FS0030: Value restriction. The value 'empties' has been inferred to have generic type val empties : '_a list []. Either define 'empties' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation.

虽然不是这样:

let makeArray () = Array.create 100 []

那么有什么区别呢?我知道 SO 问题有一个传统,包括“你尝试过什么”,但我什至不知道该尝试什么,这是一个概念性问题......

【问题讨论】:

那么有什么区别呢? empties 是一个值,makeArray () 是一个函数。 感兴趣的:What does this '()' notation mean? empties is a value and makeArray () is a function,我仍然不明白为什么第一个给出值限制错误而第二个没有?任何一种情况都应该是通用的.. 简答:函数可以是泛型的,值不能。长答案:blogs.msdn.microsoft.com/mulambda/2010/05/01/… 【参考方案1】:

cmets 中的链接应该可以解决您的大部分问题。但是你想用这段代码实现什么?你想要一个包含 100 个空列表的数组吗?

其实makeArray ()empties 没有区别。如果你执行它,你会得到同样的错误信息:

错误 FS0030:值限制。 'it' 的值已被推断为 有泛型类型 val it : '_a list [] 将 'it' 定义为一个简单的数据项,使其成为具有显式参数的函数,或者,如果您不打算 要使其具有通用性,请添加类型注释。

这将创建一个包含 100 个列表的数组:let mkArr2<'a> = Array.create<'a list> 100

类似但默认值为 0(但我去掉了 [] 列表参数):let mkArr3<'a> = Array.zeroCreate<'a> 100

最后是一个空数组:let mkArr4<'a> = Array.empty<'a>

或者使用传统的数组初始化语法可能是这样的:let mkArr5<'a> = Array.init 100 (fun _ -> []:'a list)

对于您的具体示例,您可以添加一个泛型类型注释。如果需要列表/数组数组,请使用 'a list'a arraylet empties<'a> = Array.create<'a> 100

【讨论】:

以上是关于值限制错误详情的主要内容,如果未能解决你的问题,请参考以下文章

ab测试参数描述详情

ab测试参数描述详情

当参数为空列表时,如何避免值限制错误?

如何解决视图限制最小值小于 1 并且是无效的 Matplotlib 日期值错误?

F# 编译器错误 FS0030,值限制问题

web3j - 从签名交易中获取交易详情(金额、gas 价格、gas 限制)