У 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_ (математика)) может обеспечить дальнейшее понимание этого.