声明变量而不分配

时间:2012-06-18 15:46:40

标签: f#

任何在F#中声明新变量而不为其赋值的方法吗?

5 个答案:

答案 0 :(得分:16)

见艾丹的评论。

如果你坚持,你可以这样做:

let mutable x = Unchecked.defaultof<int>

这将为数值类型分配绝对零值(0,引用类型为null,值类型为struct-zero。

答案 1 :(得分:7)

您还可以使用explicit field语法:

type T =
  val mutable x : int

答案 2 :(得分:7)

知道为什么作者需要在F#中使用此功能会很有趣(预期用途的简单示例就足够了)。

但是我猜想当你可能在C#中使用未初始化的变量时,常见的情况之一就是当你使用out参数调用函数时:

TResult Foo<TKey, TResult>(IDictionary<TKey, TResult> dictionary, TKey key)
{
    TResult value;
    if (dictionary.TryGetValue(key, out value))
    {
        return value;
    }
    else
    {
        throw new ApplicationException("Not found");
    }
}

幸运的是,在F#中你可以使用更好的语法处理这种情况:

let foo (dict : IDictionary<_,_>) key = 
    match dict.TryGetValue(key) with
    | (true, value) -> value
    | (false, _) -> raise <| ApplicationException("Not Found")

答案 3 :(得分:4)

我同意所有说过“不要这样做”的人。但是,如果您确信自己确实处于必要状态,则可以执行以下操作:

let mutable naughty : int option = None

...然后再分配一个值。

naughty <- Some(1)

但请记住,所有说“改变你的方法”的人都可能是对的。我在F#全时编码,我从来没有必要声明一个未分配的'变量'。

另一点:尽管你说使用F#不是你的选择,但我预测你很快会认为自己很幸运能够使用它!

答案 4 :(得分:2)

F#变量默认是不可变的,因此以后不能分配值。因此,在没有初始值的情况下声明它们会使它们毫无用处,因此没有机制可以这样做。

可以说,一个可变变量声明可以在没有初始值的情况下声明并且仍然有用(它可以像C#变量一样获取初始默认值),但F#的语法不支持这一点。我猜这是为了保持一致性,因为可变的变量槽不是惯用的F#所以没有动力去制作特殊情况来支持它们。