代码之家  ›  专栏  ›  技术社区  ›  Dmitri Nesteruk

如何创建可变选项类型?

  •  4
  • Dmitri Nesteruk  · 技术社区  · 15 年前

    我需要创建一个可变的 option<T> F型。我试过写作

    let x = ref None
    

    以及随后的写作

    x := Some(z)
    

    但没用。救命!

    2 回复  |  直到 15 年前
        1
  •  7
  •   Johan Kullbom    15 年前

    您需要显式地声明类型以避免 "the Value Restriction" (或见) "Automatic Generalization" on msdn ):

    let x : Ref<int option> = ref None
    
    x := Some 4
    
        2
  •  4
  •   Tomas Petricek    15 年前

    还要注意的是,只有在逐行输入f interactive中的代码时,才会遇到这个问题。如果在不提供类型注释的情况下输入第一行,将出现错误:

    > let x = ref None;;
    // Tests.fsx(1,7): error FS0030: Value restriction.
    

    但是,如果您输入一个更大的代码版本,它使用 x ref cell(例如给它赋值)然后f将能够从代码的后面部分推断出类型,因此您不需要任何类型注释。例如:

    > let x = ref None
      x := Some(10);;
    

    这很好,因为f将推断 X 从第二行开始。这意味着,如果您将代码以交互方式发送到f进行更大部分的测试(在编译的f代码中,您几乎永远不会遇到这个问题),那么您可能不需要任何类型注释。