【发布时间】:2010-03-05 10:20:56
【问题描述】:
我需要在 F# 中创建一个可变的 option<T> 类型。我试过写
let x = ref None
然后写
x := Some(z)
但它不起作用。救命!
【问题讨论】:
-
只是想知道,但为什么你需要一个可变选项?
我需要在 F# 中创建一个可变的 option<T> 类型。我试过写
let x = ref None
然后写
x := Some(z)
但它不起作用。救命!
【问题讨论】:
您需要明确声明类型以避免"the Value Restriction"(或参见"Automatic Generalization" on msdn):
let x : Ref<int option> = ref None
x := Some 4
【讨论】:
另请注意,只有在 F# 交互式逐行输入代码时才会遇到此问题。如果你在没有提供类型注释的情况下输入第一行,你会得到错误:
> let x = ref None;;
// Tests.fsx(1,7): error FS0030: Value restriction.
但是,如果您输入使用x 引用单元格的较大部分代码(例如为其分配一个值),那么 F# 将能够从代码的后面部分推断出类型,所以您赢了不需要任何类型注释。例如:
> let x = ref None
x := Some(10);;
这可以正常工作,因为 F# 会从第二行推断 x 的类型。这意味着如果您将代码以交互方式发送到 F# 以进行较大部分的测试,您可能不需要任何类型注释(在编译的 F# 代码中,您几乎永远不会遇到这个问题)。
【讨论】: