Есть ли способ получить предупреждения для теневых значений в 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, способ, которым он реализован сейчас, был бы почти полностью не функционален, если бы у нас не было теневого копирования.

Другие вопросы по тегам