Tak, Haskell ma zmienne. Rozważmy (zasadniczo równoznaczne) Definicje
inc n = n + 1
inc = \n -> n + 1
W obu przypadkach n
jest zmienna; przybierze różne wartości w różnym czasie. Haskell Report, w Section 3 odnosi się do nich jawnie jako zmienne.
To n
tutaj jest zmienna może być łatwiej zobaczyć jeśli weźmiemy pod uwagę następujące kompletny program:
inc n = n + 1
f = inc 0
g = inc 1
main = print (f+g)
Odpowiedź drukowany będzie „3”, oczywiście. Przy ocenie f
, jak poszerzyć inc
x
odbędzie się na wartości 0
, a gdy później (lub wcześniej!) Oceny g
, jak poszerzyć inc
x
odbędzie się na wartości 1
.
Pewne zamieszanie mogło powstać, ponieważ Haskell, podobnie jak w innych językach wymienionych w pytaniu, jest językiem z jednym przydziałem: nie pozwala na zmianę przypisania zmiennych w zakresie. Po przypisaniu wartości do wartości 42
, nie może ona być mniejsza niż 42, bez wprowadzania nowego zakresu z nową n
(która jest inną zmienną, śledzącą inne n
) związaną z inną wartością.
To nie może być zupełnie oczywiste w niektórych kontekstach, takich jak wyrażenia używając do
:
do let n = 1
print n
let n = 2
print n
ale jeśli usunąć cukier syntaktyczny, tłumacząc ją w Haskell bez do
, staje się jasne, że nie było Nowy zagnieżdżonej zakres utworzony, gdy w tym zakresie n
wewnętrznej jest inna zmienna jest osłanianie n
w zakresie zewnętrznej:
(let n = 1
in (print n >> (let n = 2
in print n)))
Brak zmienne w Haskell! Zmienne mogą być przypisane. Co masz w funkcji lub let-wiązania nie jest niczym innym niezmiennej funkcji argument, wartość, która jest związana z nazwą! – Dario
Dario, wikipedia nie zgadza się, wymienia dziewięć języków, w których wszystkie zmienne są pojedynczymi zadaniami, a kolejne pięć, gdzie pojedyncze przypisanie jest opcją: http://en.wikipedia.org/wiki/ Single_assignment Ponadto, matematycy, którzy wymyślili termin, również używają zmiennych w sensie pojedynczego przypisania.Jeśli masz zamiar spierać się z tym, co powiesz na opublikowanie szczegółowej odpowiedzi pokazującej dlaczego jest to niepoprawny widok? –