28

J'ai souvent entendu des affirmations selon lesquelles Haskell n'a pas de variables; en particulier, this answer prétend que non, et il a été mis au vote au moins neuf fois et accepté.Est-ce que Haskell a des variables?

Alors, est-ce qu'il y a des variables ou pas, et pourquoi?

Cette question semble également appliquer ML, F #, OCaml, Erlang, Oz, Lava et tous les langages intermédiaires SSA.

Répondre

47

Haskell a des variables immuables (variables dans le sens mathématique) par défaut:

foo x y = x + y * 2 

par des variables par défaut ne sont pas des cellules mutables.

Haskell a aussi des cellules mutables bien, mais vous leur permettre explicitement:

> v <- newIORef 0 
> readIORef v 
0 

> writeIORef v 7 
> readIORef v 
7 

Ainsi, OUI Haskell a des variables vraies. Mais il n'utilise pas de variables mutables par défaut.

4

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 incx prendra la valeur 0, et quand plus tard (ou plus tôt!) L'évaluation g, alors que nous élargissons incx 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))) 
+1

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

+6

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? –

3

"J'ai entendu dire que Haskell n'a pas de variables. ? Est-ce vrai ».

No

"ne Merci donc des variables ou non, et pourquoi"

Yes.

EDIT: Ma réponse provoque un double négatif, ce qui est naturellement confondant parce que la question de titre est positive tandis que le corps n'est pas. :)

EDIT2: Édité encore, puisque l'OP a changé la question.

+1

ou citez la question à laquelle vous avez répondu? Maintenant, quand j'ouvre cette question intitulée "Est-ce que Haskell a des variables?" la première réponse que je vois est "non". (Évidemment, je n'ai pas vraiment lu la question complète, juste le titre.) –

8

La réponse simple est: oui, Haskell a des variables comme défini dans Section 3.2 of the Haskell Report. Les variables peuvent apparaître dans des modèles et peuvent donc être liées à une valeur en utilisant des constructions telles que let, case et des listes de compréhension.

Peut-être implicite dans vos questions est de savoir si une variable est correctement appelée une variable si elle est immuable. Je pense que les autres réponses couvrent suffisamment la mutabilité.

3

Selon [Wikipedia] (http://en.wikipedia.org/wiki/Variable_(programming)), oui, Haskell a des variables:

Dans la programmation informatique, une variable est un identifiant (généralement une lettre ou un mot) qui est lié à une valeur stockée dans la mémoire du système ou une expression qui peut être évaluée. Par exemple, une variable peut être appelée « TOTAL_COUNT » et contient un certain nombre.
dans les langages de programmation impératifs, les valeurs peuvent généralement être consultés ou modifiés à tout moment. Cependant, dans le plus pur langages fonctionnels et logiques, les variables sont liées aux expressions et gardent une valeur unique r durée de vie entière en raison des exigences de transparence référentielle. Dans les langages impératifs, le même comportement est présenté par les constantes, qui sont typiquement opposées aux variables normales.

Toutes les définitions de Wikipédia ne sont pas parfaitement fiables, bien sûr.

La page sur [variables mathématiques] (http://en.wikipedia.org/wiki/Variable_(mathematics)) peut donner un meilleur aperçu ce.