FSharp: несколько значений с одинаковым именем

let a = 1
let a = 2
let b = a

Этот код спокойно компилируется, запускается и связывает b = 2.

Но является ли это желаемым поведением? Это позволяет кодировщику повторно использовать соответствующее имя значения, никакие объекты не были изменены, однако среди n строк кода слишком легко случайно снова использовать имя значения в том же пространстве имен. а с практической точки зрения ввести ошибку путем мутации. Интересно, как это согласуется с функциональной парадигмой и должно ли быть своего рода предупреждение.


person rbonallo    schedule 04.04.2017    source источник
comment
stackoverflow.com/questions/11157358/immutable-in-f   -  person Alexan    schedule 04.04.2017
comment
Как указано в другом, значения дизайна неизменяемы, но привязки в F # изменяемы. Это дело вкуса. Однако у повторного использования имен переменных есть недостаток, заключающийся в том, что код становится менее поддающимся отладке, поскольку отладчик разработан для C# (что не допускает повторного использования), поэтому можно увидеть только значение последней привязки.   -  person Just another metaprogrammer    schedule 04.04.2017


Ответы (2)


Вы не совсем правы, так как это возможно только локально.

Такое поведение называется затенением. Теневое копирование — очень эффективный способ сделать код более читабельным и не менее понятным, как может показаться, если вы привыкли к императивным языкам. На самом деле это может помочь предотвратить ошибки, а не создавать ошибки, переопределяя имя идентификатора, тем самым блокируя доступ к предыдущему определению.

Вот пример, показывающий типичное использование затенения, где используются следующие типы: Insect option, Insect и UnclassifiedInsect.

match insect with
| Some insect ->
    match insect with
    | Butterfly butterfly -> printfn "It's a butterfly."
    | UnclassifiedInsect insect -> printfn "New species? %A." insect
| None -> printfn "There was no insect."

PS: F# также имеет императивные конструкции, так что есть возможность испортить, например. путем смешивания затенения и изменяемых переменных. Просто не делай этого. Но в целом слежка — это благо.

person Bent Tranberg    schedule 04.04.2017

Это предполагаемое поведение для F# и, например, OCaml. С другой стороны, Haskell не допускает такого и выдает ошибку компиляции.

person mateuszlewko    schedule 04.04.2017
comment
Да, раньше я использовал единственный истинный язык и помню, что такие вещи были запрещены. - person rbonallo; 05.04.2017