提问人:Bad 提问时间:1/8/2017 更新时间:1/8/2017 访问量:199
值限制错误详细信息
value restriction error details
问:
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 问题有一个传统,包括“你尝试过什么”,但我什至不知道该尝试什么,这是一个概念性问题......
答:
评论中的链接应该可以解决您的大部分问题。但是你想用这段代码实现什么呢?您想要一个包含 100 个空列表的数组吗?
其实和 没什么区别。如果你执行它,你会得到相同的错误消息:makeArray ()
empties
错误 FS0030:值限制。“it”值已推断为 具有泛型类型 val it : '_a列表 [] 要么将 '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
评论
empties
makeArray ()
empties is a value and makeArray () is a function
,我仍然不明白为什么第一个给出值限制错误而第二个没有?这两种情况都应该是通用的。