在Visual Studio中,有没有一种方法可以针对F#中的值阴影设置警告?

7
我认为像Shadowing and Nested functionimmutable in F#f# duplicate definitionFSharp for fun and profit comment中所描述的现有值的遮蔽,似乎与使F#如此强大的不可变性和类型安全的概念相违背。在F#中,遮蔽different于C#。我花了很长时间才发现我的代码中的一个错误是由于同一作用域内名称的无意遮蔽造成的。是否有一种方法可以在VS中为遮蔽值提供编译器警告?

我知道在某些情况下它可能很有用,例如对于已检查的算术


2
阴影复制是有用的,正如这里所指出的:http://infsharpmajor.wordpress.com/。您可能需要解释一下您认为的阴影复制是什么,因为您的理解可能有误,澄清这一点可能会解决您的问题。 - James Black
@Goswin:F# Power Tools将会突出显示引用,这有助于避免此类错误。 - Daniel
@JamesBlack 我修改了我的问题,使其更清晰明了。 - Goswin Rothenthal
@Daniel 是否有针对重新定义名称的明确突出显示?那将非常棒!! - Goswin Rothenthal
1
当你悬停在一个值上时,它会突出显示该值的所有引用。这可以帮助你区分与相同名称的其他值。你可以在这里看到演示,尽管不幸的是它没有显示阴影。 - Daniel
2个回答

5

我在解决没有提供值的可选参数时,会使用阴影技术将其解析为默认值。

member x.Foo(?myFlag: bool) =
    let myFlag = defaultArg myFlag false
    ...

此外,F# Interactive现在的实现方式如果没有影子技术,基本上就无法正常工作。

3
阴影有利有弊。我也遭遇过因阴影努力而产生的错误。优点是,正如 @JoelMueller 指出的那样,它可以帮助保持你的变量空间整洁。
阴影错误与可变变量错误根本不同。它们属于打字错误的类型。它们要容易得多:历史信息损失最小化到词汇上下文,而不是环境上下文。也就是说,在阴影下,你总是可以通过精神栈展开干净地跟踪绑定的值,而变量突变则创建了基本上是goto(跳转到地址)的东西。
实际上,阴影仍然消除了整个类别的错误。你不会遇到任何"远程鬼魂行动"。也就是说,你不会遇到在闭包中捕获的变量或在相对于当前作用域的嵌套作用域中修改的变量的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接