Sì, Haskell ha variabili. Si consideri la (sostanzialmente equivalente) definizioni
inc n = n + 1
inc = \n -> n + 1
In entrambi i casi, n
è una variabile; assumerà diversi valori in momenti diversi. Lo Haskell Report, in Section 3 si riferisce a questi esplicitamente come variabili.
Questo n
qui è una variabile può essere più facile per vedere se consideriamo il seguente programma completo:
inc n = n + 1
f = inc 0
g = inc 1
main = print (f+g)
La risposta stampata sarà "3", naturalmente. Nel valutare f
, come noi espandere inc
x
assumerà il valore 0
, e quando più tardi (o prima!) Valutare g
, come noi espandere inc
x
assumerà il valore 1
.
È possibile che si sia verificata una certa confusione perché Haskell, come le altre lingue elencate nella domanda, è un linguaggio a assegnazione singola: non consente la riassegnazione di variabili all'interno di un ambito. Una volta n
è stato assegnato il valore 42
, non può essere altro che 42 senza introdurre un nuovo ambito con un nuovo n
(che è una variabile diversa, che ombreggia l'altro n
) associato a un altro valore.
Questo può non essere del tutto evidente in alcuni contesti, come ad esempio le espressioni utilizzando do
:
do let n = 1
print n
let n = 2
print n
ma se si rimuove lo zucchero sintattico, traducendolo in Haskell senza il do
, diventa chiaro che c'è stata una nuovo, ambito nidificato creato dove la n
in tale ambito interno è una variabile che è differente shadowing il n
del perimetro esterno:
(let n = 1
in (print n >> (let n = 2
in print n)))
Non ci sono variabili a Haskell! Le variabili possono essere riassegnati. Quello che hai in funzioni o let-binding non è altro che una funzione immutabile argomento, un valore associato a un nome! – Dario
Dario, wikipedia non è d'accordo, elencando nove lingue in cui tutte le variabili sono a assegnazione singola e altre cinque in cui l'assegnazione singola è un'opzione: http://en.wikipedia.org/wiki/ Single_assignment Inoltre, i matematici, che hanno ideato il termine, usano anche le variabili nel senso di assegnazione singola.Se hai intenzione di discuterne, come pubblicare una risposta dettagliata che mostri perché questa è una vista errata? –