Затенение в F # - PullRequest
       37

Затенение в F #

2 голосов
/ 08 марта 2020

Мне интересно, почему F # допускает теневое копирование, особенно в одной и той же области видимости.

Я всегда думал, что привязка значений в чисто функциональных конструкциях программирования сродни присваиваниям в алгебре / математике.

Так, например,

y = x + 1

будет допустимым математическим выражением, но

y = y + 1

won ' t be.

Однако из-за затенения

let y = y + 1

является совершенно допустимым выражением в F #.

Почему язык допускает это

1 Ответ

3 голосов
/ 08 марта 2020

Самый правильный ответ на этот вопрос заключается в том, что создатель, Дон Сайм, считает, что это полезная функция для добавления в язык.

Однако есть несколько хороших вариантов его использования. Один из них - при работе с необязательными параметрами в стиле 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 #.

...