У Haskell есть переменные? - PullRequest
30 голосов
/ 14 июня 2009

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

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

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

Ответы [ 5 ]

51 голосов
/ 15 июня 2009

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

 foo x y = x + y * 2

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

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

 > import Data.IORef (newIORef, readIORef, writeIORef)
 > v <- newIORef 0
 > readIORef v
 0

 > writeIORef v 7
 > readIORef v
 7

Итак, ДА В Haskell есть истинные переменные. Но по умолчанию он не использует изменяемые переменные.

9 голосов
/ 15 июня 2009

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

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

5 голосов
/ 14 июня 2009

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

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

В обоих этих случаях n является переменной; он будет принимать разные значения в разное время. Отчет по Haskell в Раздел 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)))
3 голосов
/ 15 июня 2009

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

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

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

Страница [математические переменные] (http://en.wikipedia.org/wiki/Variable_(mathematics)) может дать дополнительную информацию об этом.

3 голосов
/ 14 июня 2009

«Я слышал, что на Хаскеле нет переменных. Это правда?»

нет

Нет .

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

Да.

РЕДАКТИРОВАТЬ: Мой ответ вызывает двойной отрицательный, что, естественно, сбивает с толку, потому что заголовок вопрос положительный, а тело нет. :)

РЕДАКТИРОВАТЬ 2: снова отредактировано, так как ОП изменил вопрос.

...