Самый правильный ответ на этот вопрос заключается в том, что создатель, Дон Сайм, считает, что это полезная функция для добавления в язык.
Однако есть несколько хороших вариантов его использования. Один из них - при работе с необязательными параметрами в стиле F #:
type C() =
member _.M(?x) =
let x = Option.defaultValue 0 x
printfn "%d" x
Необязательные параметры F # - это опции, которые обеспечивают высокую степень корректности и согласованности. Но представьте, что у метода есть 3 или более дополнительных параметра. Было бы досадно пересматривать значение каждого из них и использовать для него другое имя! Это одна из областей, где затенение пригодится.
Это также удобно при написании рекурсивных подпрограмм. Рассмотрим следующую наивную реализацию sum
для списка:
let mySum xs =
let rec loop xs acc =
match xs with
| [] -> acc
| h :: t -> loop t (h + acc)
loop xs 0
Мне не нужно перепривязывать xs
для внутреннего l oop из-за затенения. Поскольку это generi c, xs
примерно настолько же хороша для названия, насколько я могу придумать, поэтому было бы досадно, если бы пришлось использовать другое имя для внутреннего l oop.
Затенение не все хорошие новости, хотя. Если вы не будете осторожны, типы из одного объявления open
могут скрывать типы от ранее объявленного. Это может сбивать с толку. Инструменты редактора F # могут отличать guish привязок от тех, которые их скрывают, но вы не получите этого с простым текстом. Итак, суть заключается в следующем: тщательно продумайте при применении затенения в F #.