Oui, Haskell a des variables. Considérons le (essentiellement équivalent) Définitions
inc n = n + 1
inc = \n -> n + 1
Dans ces deux cas, n
est une variable; il va prendre des valeurs différentes à des moments différents. Le Haskell Report, en Section 3 fait explicitement référence à ces variables.
Ce n
ici est une variable peut être plus facile de voir si l'on considère le programme complet ci-dessous:
inc n = n + 1
f = inc 0
g = inc 1
main = print (f+g)
La réponse imprimée sera « 3 », bien sûr. Lors de l'évaluation f
, alors que nous élargissons inc
x
prendra la valeur 0
, et quand plus tard (ou plus tôt!) L'évaluation g
, alors que nous élargissons inc
x
prendra la valeur 1
.
Une certaine confusion peut s'être produite car Haskell, comme les autres langues listées dans la question, est un langage à affectation unique: il ne permet pas la réaffectation de variables dans une portée. Une fois que n
a été affecté la valeur 42
, il ne peut pas être autre chose que 42 sans introduire une nouvelle portée avec un nouveau n
(qui est une variable différente, ombrant l'autre n
) lié à une autre valeur.
Cela peut ne pas être tout à fait évident dans certains contextes, comme les expressions utilisant do
:
do let n = 1
print n
let n = 2
print n
mais si vous supprimez le sucre syntaxique, le traduire en Haskell sans do
, il devient clair qu'il y avait un nouveau, la portée imbriquée créé lorsque le n
en ce que la portée intérieure est une autre variable qui est l'ombrage n
dans le périmètre externe:
(let n = 1
in (print n >> (let n = 2
in print n)))
Il n'y a pas de variables dans Haskell! Les variables peuvent être réaffectés. Ce que vous avez dans les fonctions ou laissez-les liaisons n'est qu'une fonction immuable argument, une valeur qui est liée à un nom! – Dario
Dario, wikipedia en désaccord, énumérant neuf langues où toutes les variables sont à affectation unique et cinq autres où l'affectation unique est une option: http://en.wikipedia.org/wiki/ Single_assignment En outre, les mathématiciens, qui ont inventé le terme, utilisent également des variables dans le sens de l'affectation unique.Si vous allez vous opposer à cela, pourquoi ne pas publier une réponse détaillée indiquant pourquoi cette vue est incorrecte? –