Ihr Code entspricht dem Folgenden, wo ich einfach Instanzen Ihrer Namen nummeriert habe, um Ihnen zu veranschaulichen, wie Shadowing auftritt.
%Vor% Dies kann natürlich weiter vereinfacht werden. Da dup2
und z2
niemals verwendet werden, ist dup1
äquivalent zu let dup1 y2 = y2
und die gesamte Funktion entspricht
Dies entspricht
%Vor%durch Substitution. Dies ist das Gleiche wie
%Vor%Hilft das?
Ich denke, @kvb gibt eine sehr gute Erklärung, wie der Code bewertet wird. Der Code kombiniert verschachtelte Funktionen und Shadowing auf ziemlich verwirrende Weise :-). Ich denke, es ist nützlich, die beiden Konzepte getrennt zu betrachten.
Mit Spiegeln können Sie einen Wert durch einen neuen Wert in der Deklaration let
oder eine Wertbindung im Konstrukt match
ausblenden. Dies bedeutet, dass Sie nicht mehr auf den ursprünglichen Wert zugreifen können. Hier ist ein einfacheres Beispiel:
Hier deklarieren wir eine Funktion, die ein Argument namens num
verwendet. Nehmen wir an, wir nennen die Funktion mit 1 als Argument. In der zweiten Zeile deklarieren wir einen neuen Wert mit dem gleichen Namen - initialisiert auf 1 + 20 , also 21 . Die dritte Zeile deklariert erneut einen neuen Wert und initialisiert ihn zu 21 * 2 (weil das zuletzt deklarierte num Symbol mit dem Wert
Dies ist vor allem nützlich, wenn Sie eine Berechnung haben, die einen neuen Wert berechnet, der von allen nachfolgenden Berechnungen verwendet werden soll. Shadowing ermöglicht es Ihnen, den vorherigen Wert zu verbergen, so dass keine Gefahr besteht, dass Sie versehentlich die ursprüngliche verwenden.
Verschachtelte Funktionen sind sehr nützlich, wenn Sie eine Berechnung des lokalen Nutzens durchführen müssen, die Parameter der äußeren Funktion verwendet. Zum Beispiel:
%Vor% Hier deklarieren wir eine verschachtelte Funktionsfunktion timesUtil
, die eine beliebige Zahl mit dem Wert x
multipliziert (was das Argument der Funktion times
ist). Dann können wir es später (in der letzten Zeile) verwenden, um die Operation auszuführen, ohne den x
-Wert erneut als Argument übergeben zu müssen. Das Interessante an verschachtelten Funktionen ist, dass sie auf Werte zugreifen können, die von der äußeren Funktion deklariert wurden.