Да, у Haskell есть переменные. Рассмотрим (по существу эквивалентный) Определения
inc n = n + 1
inc = \n -> n + 1
В обоих этих случаях, n
является переменной; он будет принимать разные значения в разное время. Haskell Report, в Section 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)))
Там нет переменных в Haskell! Переменные могут быть переназначены. То, что вы имеете в функции или LET-привязок нет ничего, кроме неизменного функции аргумент, значение, привязанное к имени! – Dario
Dario, wikipedia не согласен с перечислением девяти языков, где все переменные являются однонаправленными, а еще пять, где однозадачность является опцией: http://en.wikipedia.org/wiki/ Single_assignment. Кроме того, математики, которые придумали этот термин, также используют переменные в смысле с одним присваиванием. Если вы собираетесь возражать против этого, как насчет публикации подробного ответа, показывающего, почему это неправильное представление? –