对我来说,隐藏现有值,如下所述:
阴影和嵌套函数
在 F# 中不可变
f# 重复定义
FSharp 以获得乐趣和利润评论
似乎违背了使 F# 如此强大的不变性和类型安全的概念。F# 中的阴影与 C# 中的工作方式不同。我花了很长时间才发现我的代码中的一个错误是由于无意中在同一范围内隐藏了一个名称。有没有办法让编译器警告 VS 中的阴影值?
我知道在某些情况下它可能很有用。例如Checked Aritmetics。
对我来说,隐藏现有值,如下所述:
阴影和嵌套函数
在 F# 中不可变
f# 重复定义
FSharp 以获得乐趣和利润评论
似乎违背了使 F# 如此强大的不变性和类型安全的概念。F# 中的阴影与 C# 中的工作方式不同。我花了很长时间才发现我的代码中的一个错误是由于无意中在同一范围内隐藏了一个名称。有没有办法让编译器警告 VS 中的阴影值?
我知道在某些情况下它可能很有用。例如Checked Aritmetics。
我使用阴影的一个地方是在没有提供值的情况下将可选参数解析为默认值。
member x.Foo(?myFlag: bool) =
let myFlag = defaultArg myFlag false
...
此外,如果我们没有阴影,现在实现的 F# Interactive 将几乎完全不起作用。
阴影有利有弊。由于粗手指的阴影工作,我也遇到了错误。从好的方面来说,正如@JoelMueller 指出的那样,它可以帮助您保持变量空间的清洁。
隐藏错误与可变变量错误根本不同。它们属于错别字。它们更容易分析:历史信息丢失最小化到词典上下文与环境上下文。也就是说,使用阴影,您始终可以通过心理堆栈展开清晰地跟踪绑定的值,而变量突变创建本质上是 goto(跳转到地址)。
实际上,阴影仍然可以消除整个类的错误。您不会遇到任何“远距离的怪异动作”。也就是说,您不会遇到在闭包中捕获的变量或在相对于当前范围的嵌套范围中修改的变量的问题。