9

有什么方法可以在 F# 中声明一个新变量而不给它赋值?

4

5 回答 5

16

见艾丹的评论。

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

let mutable x = Unchecked.defaultof<int>

这将分配绝对零值(0对于数字类型,null对于引用类型,对于值类型,结构零)。

于 2012-06-18T15:57:30.757 回答
8

知道作者为什么在 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")
于 2012-06-19T07:34:11.073 回答
7

您还可以使用显式字段语法:

type T =
  val mutable x : int
于 2012-06-18T16:23:54.607 回答
4

我同意所有说“不要这样做”的人的观点。但是,如果您确信您确实需要这样做,您可以这样做:

let mutable naughty : int option = None

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

naughty <- Some(1)

但请记住,所有说过“改变你的方法”的人可能都是对的。我全职使用 F# 编写代码,而且我从来不需要声明未分配的“变量”。

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

于 2012-06-19T12:48:40.200 回答
2

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

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

于 2012-06-18T15:56:01.153 回答