У Haskell есть переменные?

Я часто слышал утверждения, что у Haskell нет переменных; в частности,ответ утверждает, что это не так, и он был поддержан по крайней мере девять раз и принят.

итак, есть ли у него переменные или нет, и почему?

этот вопрос также, по-видимому, применяется ML, F#, OCaml, Erlang, Oz, Lava и все SSA промежуточный язык.

5 ответов


Haskell имеет неизменяемые переменные (переменные в математическом смысле) по умолчанию:

 foo x y = x + y * 2

по умолчанию переменные не являются изменяемые ячейки.

Haskell также имеет изменяемые ячейки, но вы включаете их явно:

 > v <- newIORef 0
 > readIORef v
 0

 > writeIORef v 7
 > readIORef v
 7

и да Haskell имеет истинные переменные. Но по умолчанию он не использует изменяемые переменные.


простой ответ: да, Haskell имеет переменные, определенные в раздел 3.2 доклада Хаскелла. Переменные могут отображаться в шаблонах и, таким образом, могут быть привязаны к значению, используя такие конструкции, как let, case, и списочные включения.

возможно, неявным в ваших вопросах является то, правильно ли переменная называется переменной, если она неизменяема. Я думаю, что другие ответы достаточно охватывают изменчивость.


Да, у Haskell есть переменные. Рассмотрим (по существу эквивалентные) определения

inc n = n + 1
inc = \n -> n + 1

в обоих случаях,n является переменной; он будет принимать разные значения в разное время. The Отчет Хаскелл, в 3 ссылается на них явно как на переменные.

это n вот переменная может быть проще увидеть, если мы рассмотрим следующую полную программу:

inc n = n + 1
f = inc 0
g = inc 1
main = print (f+g)

ответ напечатал будет "3", Конечно. При оценке f, как мы расширяем inc x будет принимать значение 0, а когда позже (или раньше!) оценка g, как мы расширяем inc x будет принимать значение 1.

возможно, возникла некоторая путаница, поскольку Haskell, как и другие языки, перечисленные в вопросе, является языком с одним назначением: он не позволяет переназначать переменные в пределах области. После n присвоено значение 42, это не может быть ничего, кроме 42 без введения новой области с новым n (это другая переменная, затеняющая другую n) привязан к другой стоимости.

это может быть не совсем очевидно в некоторых контекстах, таких как выражения с использованием do:

 do let n = 1
    print n
    let n = 2
    print n

но если вы удалите синтаксический сахар, переведя его в Haskell без do, становится ясно, что была создана новая вложенная область, где n в этом внутреннем объеме другая переменная, которая затеняет n во внешней области:

(let n = 1 
  in (print n >> (let n = 2
                   in print n)))


согласно [Википедии] (http://en.wikipedia.org/wiki/Variable_ (Программирование)), да, Haskell имеет переменные:

В компьютерном программировании переменная-это идентификатор (обычно буква или слово), связанный со значением, хранящимся в памяти системы, или выражением, которое можно вычислить. Например, переменная может называться "total_count" и содержать число.
В императивных языках программирования, как правило, можно получить доступ к значениям или изменены в любое время. Однако в чисто функциональных и логических языках переменные привязаны к выражениям и сохраняют одно значение в течение всего своего времени жизни из-за требований ссылочной прозрачности. В императивных языках то же самое поведение проявляется константами, которые обычно противопоставляются нормальным переменным.

конечно, не все определения Википедии полностью заслуживают доверия.

страница на [математическая переменные] (http://en.wikipedia.org/wiki/Variable_ (математика)) может обеспечить дальнейшее понимание этого.