Что такое ключевое слово "let" в функциональных языках, таких как F # и OCaml?

При взгляде на примеры кода F #, Ocaml и других функциональных языков я замечаю, что ключевое слово let используется очень часто.

  • Зачем вам это нужно? Почему языки разработали его?
  • Почему вы не можете просто оставить это? например: пусть x = 4 становится x = 4

Ответы

Ответ 1

В F # (и OCaml) let - довольно мощная конструкция, которая используется для привязки значения, что означает назначение некоторого значения символу. Это может означать различные вещи:

Объявление локального или глобального значения - вы можете использовать его для объявления локальных значений. Это похоже на создание переменной в императивных языках, за исключением того, что значение переменной не может быть изменено позже (она неизменна):

let hello = "Hello world"
printfn "%s" hello

Объявление функции - вы также можете использовать ее для объявления функций. В этом случае вы указываете, что символ является функцией с некоторой arity:

let add a b = a + b
printfn "22 + 20 = %d" (add 22 20)

Зачем вам это нужно? В F # код был бы двусмысленным без него. Вы можете использовать скрытие значения для создания нового символа, который скрывает предыдущий символ (с тем же именем), поэтому, например, следующие возвраты true:

let test () =
  let x = 10
  let x = 20 // hides previous 'x'
  x = 20     // compares 'x' with 20 and returns result

Если вы опустили ключевое слово let, вы не знаете, сравниваете ли вы значения или объявляете новый символ. Кроме того, как отмечают другие, вы можете использовать синтаксис let <symbol> = <expression> in <expression> (если вы используете разрыв строки в F #, тогда вам не нужно in), чтобы записывать привязки значений как часть другого выражения:

let z = (let x = 3 + 3 in x * x)

Здесь значение z будет 36. Хотя вы можете придумать какой-то синтаксис, который не требует ключевого слова let, я думаю, что использование let просто делает код более читаемым.

Ответ 2

Основная цель "let" - поместить область вокруг своих определений.

let <definitions> in <expression>

Удостоверяется, что определения не загрязняют пространство имен ничего, кроме <expression>.

Ответ 3

"let" вводит новую область видимости переменной и позволяет привязывать переменные к значениям для этой области. Его часто читают как "пусть x будет [значение] в...". Когда у вас нет назначений, очень полезно избегать конфликтующих имен переменных.

Ответ 4

В Haskell

foo = let x = 5
      y = 7
      in z=x+y

используется для пояснения, что x и y являются переменными "private" для foo.

Ответ 5

let означает "связывать значение для имени" и, как правило, говорит, создает новую переменную. x = 4 означает "присваивать 4 x", который не создает новое имя.

См. http://msdn.microsoft.com/en-us/library/dd233238.aspx

Ответ 6

Если вы изучаете, эта лекция может быть уместна, особенно. часть об оценке допустимого члена.