F # Code Ausführungsreihenfolge

8

eine weitere noob Frage in Bezug auf F #.

Wenn ich den folgenden Code habe ...

%Vor%

Die Ausgabe ist wie folgt ...

%Vor%

Was hier ungewöhnlich erscheint, ist die Reihenfolge, in der der Code ausgeführt wird. In einer früheren Frage erwähnte Brian etwas über Ausdrücke, ich hoffte, dass jemand das etwas mehr erklären könnte. Es sieht fast so aus, als würde der Compiler Dinge intelligent berechnen, um Werte zu berechnen ... aber ich weiß es nicht?

    
Mark Pearl 03.07.2010, 09:06
quelle

2 Antworten

13

ExeA und ExeC sind keine Funktionen, sondern einzelne Werte. Der Compiler stellt sicher, dass die Werte in der Reihenfolge initialisiert werden, in der sie in der Quelldatei deklariert sind. Daher geschieht Folgendes:

  1. ExeC initialisiert
  2. ExeA initialisiert
  3. Example 1 wird mit dem initialisierten Wert ExeA
  4. gedruckt
  5. Die Funktion ExeB wird als normal
  6. bezeichnet
  7. Example 3 wird mit dem initialisierten Wert ExeC
  8. gedruckt

Wenn Sie möchten, dass ExeA und ExeC wirklich faul sind - das heißt, wenn ihre Nebeneffekte laufen - können Sie sie in Funktionen verwandeln, die unit akzeptieren:

%Vor%     
Tim Robinson 03.07.2010, 09:13
quelle
3

Als Nachfolge von Tims Antwort dachte ich, Sie würden vielleicht einen weiteren Einblick in das bekommen, worüber Sie gestolpert sind. In Ihrem Beispiel nutzen ExeC und ExeA den funktionalen Stil des Organisierens von Code durch lexikalisches Scoping und Closures. Lassen Sie mich ein leistungsfähigeres Beispiel zeigen.

%Vor%

Auch hier ist timesPieDiv4 keine Funktion, hat aber einen Rumpf, der eine Reihe von Unterberechnungen enthält, die nicht dem Rest der calc -Funktion ausgesetzt sind. In einer Sprache wie C # haben Sie zwei Möglichkeiten, die beide mich nicht ansprechen. Die erste Option besteht darin, einfach pie und pieDiv4 innerhalb des Hauptteils von calc zu deklarieren, aber dann ist es weniger klar, wie sie verwendet werden und Sie Ihren Variablenraum verschmutzen. Die andere Möglichkeit besteht darin, diese Unterberechnungen in eine separate private Hilfsfunktion zu faktorieren. Aber ich mag solche Funktionen nicht, weil es für viele schwierig ist, Ihre komplexen Algorithmen zu analysieren, da Sie ständig nach verschiedenen Implementierungselementen suchen. Plus es ist eine Menge Kesselplatte Code und Wertübergabe. Aus diesem Grund sind F # -Funktionen standardmäßig "public", lexikalische Scoping- und Closure-Funktionen erlauben es Ihnen, "private" Funktionen und Werte in Ihren Public-Facing-Funktionen hierarchisch zu organisieren.

    
Stephen Swensen 03.07.2010 17:49
quelle

Tags und Links