F #: Warum muss ich 'unit' explizit für Funktionen angeben, die keine Argumente enthalten?

8

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?

    
J Cooper 30.01.2010, 00:38
quelle

2 Antworten

15

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.

    
Juliet 30.01.2010, 01:04
quelle
6

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

%Vor%

definiert eine Funktion, hat jetzt keine Auswirkungen und wird jedes Mal, wenn name() aufgerufen wird, ausgewertet (und hat Auswirkungen).

    
Brian 30.01.2010 01:35
quelle

Tags und Links