28

Często słyszę twierdzenia, że ​​Haskell nie ma zmiennych; w szczególności, this answer twierdzi, że tak nie jest i zostało przegłosowane co najmniej dziewięciokrotnie i zaakceptowane.Czy Haskell ma zmienne?

Czy ma zmienne, czy nie, i dlaczego?

To pytanie wydaje się również dotyczyć języków pośrednich ML, F #, OCaml, Erlang, Oz, Lava i wszystkich języków SSA.

Odpowiedz

47

Haskell ma zmienne niezmienne (zmienne w sensie matematycznym) domyślnie:

foo x y = x + y * 2 

Przez domyślnych zmiennych nie są komórki Zmienne.

Haskell ma również komórki zmienny chociaż, ale umożliwić im wyraźnie:

> v <- newIORef 0 
> readIORef v 
0 

> writeIORef v 7 
> readIORef v 
7 

Więc TAK Haskell ma prawdziwych zmiennych. Ale domyślnie nie używa zmiennych zmiennych.

4

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ć incx odbędzie się na wartości 0, a gdy później (lub wcześniej!) Oceny g, jak poszerzyć incx 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))) 
+1

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

+6

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

3

"Słyszałem, że Haskell nie ma zmiennych. Czy jest to prawda”.

No

"Więc to ma zmienne, czy nie, i dlaczego"

Yes.

EDIT:? Moja odpowiedź powoduje dwukrotnie ujemny, co jest oczywiście mylące, ponieważ pytanie nagłówka jest pozytywne, a ciało nie. :)

EDIT2: Edytowany ponownie, ponieważ PO zmienił pytanie.

+1

Mógłbyś podajesz pytanie, na które odpowiedziałaś? Teraz, kiedy otwieram to pytanie zatytułowane "Czy Haskell ma zmienne?" pierwsza odpowiedź, którą widzę, to "Nie". (Oczywiście, tak naprawdę nie przeczytałem pełnego pytania, tylko tytuł). –

8

Prosta odpowiedź brzmi: tak, Haskell ma zmienne zdefiniowane w Section 3.2 of the Haskell Report. Zmienne mogą pojawiać się we wzorcach, a zatem mogą być powiązane z wartościami przy użyciu konstruktów takich jak let, case i ze zrozumieniem list.

Być może implicite w twoich pytaniach jest to, czy zmienna jest właściwie nazywana zmienną, jeśli jest niezmienna. Myślę, że inne odpowiedzi w wystarczającym stopniu uwzględniają zmienność.

3

Według [Wikipedia] (http://en.wikipedia.org/wiki/Variable_(programming)), tak, Haskell ma zmienne:

W programowaniu komputerowym, zmienna jest identyfikatorem (zwykle list lub Word), który jest połączony z wartością zapisaną w pamięci systemu lub wyrażenie, które może być ocenione.Na przykład zmienna może być nazywana "total_count" i zawierać liczbę.
W imperatywnych językach programowania, wartości mogą być ogólnie dostępne lub zmienione w dowolnym czasie. języki funkcjonalne i logiczne, zmienne są powiązane z wyrażeniami i zachowują pojedynczą wartość podczas thei r całe życie ze względu na wymogi przejrzystości referencyjnej. W językach imperatywnych to samo zachowanie jest wykazywane przez stałe, które są zazwyczaj skontrastowane ze zwykłymi zmiennymi.

Oczywiście nie wszystkie definicje Wikipedii są całkowicie godne zaufania.

strona na [zmiennych matematycznych] (http://en.wikipedia.org/wiki/Variable_(mathematics)) mogą dostarczyć dalszych wgląd w to.

Powiązane problemy