Есть ли способ получить предупреждения для теневых значений в F# в Visual Studio?
Для меня слежка за существующими ценностями, как описано в:
Затенение и Вложенная функция
неизменный в F#
F# повторяющееся определение
FSharp для коментариев и получения прибыли
кажется, идет вразрез с понятием неизменности и безопасности типов, что делает F# таким сильным. Затенение в F# работает иначе, чем в C#. Мне потребовалось довольно много времени, чтобы выяснить, что ошибка в моем коде была вызвана непреднамеренным затенением имени в той же области видимости. Есть ли способ получить предупреждения компилятора для теневых значений в VS?
Я знаю, что в некоторых случаях это может быть полезно. например для Проверенной Аритметики.
2 ответа
Затенение имеет свои плюсы и минусы. Я тоже сталкивался с ошибками из-за усилий по теневанию. С другой стороны, это может помочь сохранить чистоту вашего переменного пространства, как указывал @JoelMueller.
Теневые ошибки принципиально отличаются от ошибок изменяемых переменных. Они имеют разновидность опечатки. Их гораздо проще анализировать: историческая потеря информации сводится к лексикографическому контексту по сравнению с контекстом окружающей среды. То есть, с теневым копированием, вы всегда можете четко отследить значение привязки через развертывание умственного стека, тогда как переменные мутации создают то, что по сути является gotos (переход к адресу).
Практически, затенение все еще устраняет целые классы ошибок. Вы не встретите никаких "жутких действий на расстоянии". А именно, вы не столкнетесь с проблемами, связанными с переменными, захваченными в замыканиях, или с изменением переменных во вложенных областях относительно текущей области.
Единственное место, где я использую теневое копирование, - это разрешение необязательного параметра в значении по умолчанию, если значение не было предоставлено.
member x.Foo(?myFlag: bool) =
let myFlag = defaultArg myFlag false
...
Также F# Interactive, способ, которым он реализован сейчас, был бы почти полностью не функционален, если бы у нас не было теневого копирования.