Was bedeutet unveränderliche Variable in Haskell?

8

Ich bin ziemlich verwirrt mit dem Konzept der unveränderlichen Variablen in Haskell. Es scheint, dass wir den Wert von Variablen in Haskell nicht ändern können. Aber als ich den folgenden Code in GHCI versuchte, schien es, als ob sich der Wert der Variablen geändert hätte:

%Vor%

Widerspricht das der Idee von unveränderlichen Variablen?

Vielen Dank!

    
yxw 26.06.2016, 16:45
quelle

2 Antworten

18

Haskell erlaubt Ihnen nicht, vorhandene Variablen zu ändern. Es erlaubt Ihnen jedoch Variablennamen wiederzuverwenden, und das ist alles, was hier passiert. Eine Möglichkeit, dies zu sehen, besteht darin, GHCi mit der Anweisung :i[nfo] zu fragen, wo die Variable deklariert wurde:

%Vor%

Das sind eigentlich zwei ganz unterschiedliche Variablen, die zufällig den gleichen Namen haben! Wenn Sie nur nach a fragen, wird die neuere Definition "bevorzugt", aber die alte ist immer noch da - eine Möglichkeit, dies zu sehen, wie in den Kommentaren von chi bemerkt, ist a in einer Funktion zu verwenden:

%Vor%

f muss sich niemals darum kümmern, dass Sie eine neue Variable definiert haben, die auch a ; Aus seiner Perspektive war a eine unveränderliche Variable, die immer so bleibt wie sie ist.

Es lohnt sich, darüber zu sprechen, warum GHCi die spätere Definition bevorzugt. Dies geschieht andernfalls in nicht im Haskell-Code; Insbesondere, wenn Sie versuchen, das folgende Modul zu kompilieren, gibt es einfach einen Fehler bezüglich der doppelten Definition:

%Vor%

Der Grund dafür, dass in GHCi so etwas erlaubt ist, ist, dass es anders als Haskell-Module funktioniert. Die Reihenfolge der GHCi-Befehle bildet in der Tat eine Folge von -Aktionen in der IO-Monade ; h. das Programm müsste

sein %Vor%

Nun, wenn Sie etwas über Monaden gelernt haben, werden Sie wissen, dass dies nur syntaktischer Zucker für

ist %Vor%

und das ist wirklich das entscheidende Bit dafür, warum Sie den Namen a wiederverwenden können: der zweite, a = 2 , lebt in einem engeren Bereich als der erste. Es ist also lokaler und lokale Definitionen haben Priorität. Ob das eine gute Idee ist, ist ein wenig umstritten; Ein gutes Argument dafür ist, dass Sie eine Funktion wie

haben können %Vor%

und es wird nicht aufhören zu arbeiten, nur weil jemand woanders definiert

%Vor%

Außerdem ist es sehr nützlich, Variablen in GHCi "neu zu definieren", auch wenn es nicht ist, so etwas in einem richtigen Programm neu zu definieren, was zeigen soll konsistentes Verhalten.

Wie dfeuer bemerkt, ist dies nicht die ganze Wahrheit. Sie können einige Dinge in GHCi tun, die in einem IO Do-Block nicht erlaubt sind, insbesondere können Sie data types und class es definieren. Aber jede normale Anweisung oder Variablendefinition verhält sich sozusagen in IO monad.

    
leftaroundabout 26.06.2016, 17:32
quelle
0

(Die andere Antwort mit GHCi ist in Ordnung, aber um zu verdeutlichen, ist es nicht spezifisch für GHCi oder Monaden ...)

Wie Sie aus der Tatsache entnehmen können, dass das folgende Haskell-Programm

%Vor%

druckt 8 anstatt 10 , Variablen können in Haskell nur "gebunden", nicht "mutiert" sein. Mit anderen Worten, das obige Programm ist äquivalent (genannt α-äquivalent , was bedeutet, dass nur die Namen gebundener Variablen konsistent geändert werden; siehe Ссылка für weitere Details) zu

%Vor%

wo klar ist, dass x1 und x2 verschiedene Variablen sind.

    
FPstudent 01.07.2016 00:10
quelle