我需要在F#中创建一个可变的option<T>
类型。我试过写
let x = ref None
随后写作
x := Some(z)
但它不起作用。救命啊!
答案 0 :(得分:7)
您需要明确说明类型以避免"the Value Restriction"(或参见"Automatic Generalization" on msdn):
let x : Ref<int option> = ref None
x := Some 4
答案 1 :(得分:4)
另请注意,只有在F#interactive in-line中逐行输入代码时才会遇到此问题。如果您在不提供类型注释的情况下输入第一行,则会收到错误:
> let x = ref None;;
// Tests.fsx(1,7): error FS0030: Value restriction.
但是,如果你输入一个更大的使用x
ref单元格的代码(例如为它赋值),那么F#将能够从代码的后面部分推断出类型,所以你不需要任何类型的注释。例如:
> let x = ref None
x := Some(10);;
这样可以正常工作,因为F#会从第二行推断出x
的类型。这意味着你可能不需要任何类型的注释,如果你将代码发送到F#进行大量测试(在编译的F#代码中,你几乎不会遇到这个问题)。