28

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

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

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

ответ

47

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

foo x y = x + y * 2 

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

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

> v <- newIORef 0 
> readIORef v 
0 

> writeIORef v 7 
> readIORef v 
7 

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

4

Да, у 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, как мы расширяем incx будет принимать значение 0, а когда позже (или раньше!) Оценки g, как мы расширяем incx будет принимать значение 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))) 
+1

Там нет переменных в Haskell! Переменные могут быть переназначены. То, что вы имеете в функции или LET-привязок нет ничего, кроме неизменного функции аргумент, значение, привязанное к имени! – Dario

+6

Dario, wikipedia не согласен с перечислением девяти языков, где все переменные являются однонаправленными, а еще пять, где однозадачность является опцией: http://en.wikipedia.org/wiki/ Single_assignment. Кроме того, математики, которые придумали этот термин, также используют переменные в смысле с одним присваиванием. Если вы собираетесь возражать против этого, как насчет публикации подробного ответа, показывающего, почему это неправильное представление? –

3

«Я слышал, что у Haskell нет переменных. ? Правда ли это».

No

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

Yes.

EDIT: Мой ответ вызывает двойной отрицателен, естественно, путают, потому что заголовок вопроса положительный, а тело нет. :)

EDIT2: Отредактировано снова, так как ОП изменил вопрос.

+1

Может ли y Вы цитируете вопрос, на который вы ответили? Теперь, когда я открываю этот вопрос под заголовком «Есть ли у Haskell переменные?» первый ответ, который я вижу, - «Нет». (Очевидно, я действительно не читал полный вопрос, просто название.) –

8

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

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

3

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

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

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

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