值限制错误详情
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 array
。let empties<'a> = Array.create<'a> 100
【讨论】:
以上是关于值限制错误详情的主要内容,如果未能解决你的问题,请参考以下文章