Also habe ich gerade mein erstes F # -Programm abgeschlossen, wobei mein einziger funktionaler Hintergrund ein kleines bisschen von Haskell-Kenntnissen ist (lies: Habe noch keine Programme darin erstellt).
Nachdem ich ein schwankendes Verhalten beobachtet hatte, wurde mir klar, dass F # unterscheidet zwischen:
%Vor%und
%Vor% Ich habe bemerkt, dass es das erstere "speichert", es nie wieder berechnet, wenn es erneut aufgerufen wird, während es das letztere wie eine normale Funktion behandelt. Sie können den Unterschied nicht feststellen, wenn die fragliche Funktion offensichtlich keine Nebenwirkungen hat, aber mein shuffle
hat!
Sollte das allgemein bekannt sein? Ich habe es bisher noch nicht in Lernmaterialien gesehen. Ist der Grund nur eine Schwäche des Parsers, so wie Sie eine Funktion deklarieren müssen, bevor Sie sie verwenden?
Das meiste F # -Material bedeutet , dass alle Anweisungen der obersten Ebene in einem Modul von oben nach unten bei der Deklaration ausgeführt werden. Mit anderen Worten, was Sie deklariert haben, ist keine Funktion, sondern ein Wert, der einmal gebunden wird, wenn das Programm ausgeführt wird.
Es hilft wirklich, den reflektierten Code zu sehen. Ich habe eine einfache Datei:
%Vor%Der kompilierte Code sieht ungefähr so aus:
%Vor%So ist man eine statische Eigenschaft, die andere ist eine Funktion. Dies ist eine wünschenswerte Eigenschaft, denn stellen Sie sich vor, wenn wir so etwas hätten:
%Vor% Wir möchten nur, dass x
einmal gebunden wird. Wir möchten nicht, dass die Datenbankfunktion jedes Mal aufgerufen wird, wenn wir auf x
zugreifen.
Zusätzlich können wir interessanten Code wie folgt schreiben:
%Vor% Da isInNebraska
ein Wert ist, wird dieser sofort ausgewertet. Es ist einfach so, dass sein Datentyp (string -> bool)
ist, also sieht wie eine Funktion aus. Daher füllen wir nur% ce_de% einmal, selbst wenn wir die Funktion 1000 Mal aufrufen.
Vergleichen wir diesen Code mit diesem:
%Vor%Hoppla! Wir erstellen bei jedem Aufruf der Funktion einen neuen Städte-Set.
Also gibt es definitiv eine legitime und echte Unterscheidung zwischen Werten und Funktionen.
So funktioniert es in fast jeder Sprache mit Nebenwirkungen.
%Vor% führt den Code 'jetzt' aus und kann Nebenwirkungen verursachen, wenn expr
Auswirkungen hat. Nachfolgende Verweise auf name
haben keine Auswirkungen. Während
definiert eine Funktion, hat jetzt keine Auswirkungen und wird jedes Mal, wenn name()
aufgerufen wird, ausgewertet (und hat Auswirkungen).