值限制错误详细信息

时间:2017-01-07 16:03:33

标签: compiler-errors f# value-restriction

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问题的传统包括“你尝试过的东西”,但我甚至不知道该尝试什么,这是一个概念性问题......

1 个答案:

答案 0 :(得分:1)

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

实际上makeArray ()empties没有什么不同。如果执行它,您将收到相同的错误消息:

  

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

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

类似但默认值为0(但我摆脱了[] list参数):
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