Ich spielte mit F # (Visual Studio 2010 Beta 1) herum und schrieb ein kleines Konsolenskript, das den Benutzer aufforderte, 2 Zahlen und einen Operator einzugeben und dann auszuführen. Es funktioniert gut, abgesehen von einem winzigen, aber lästigen Ding: manchmal werden meine Printfn-Anweisungen ignoriert. Ich habe Haltepunkte im Code platziert, um zu sehen, dass das tatsächlich der Fall ist.
Das Code-Snippet:
%Vor%Das ist natürlich nicht die komplette Quelle, aber ich denke, das wird reichen. Wenn Sie die vollständige Quelle benötigen, lassen Sie es mich wissen.
Also meine Frage ist ziemlich einfach: Was verursacht dieses Problem mit printfn? Mache ich etwas falsch?
Vielen Dank im Voraus, ShdNx
Diese Seite hat eine teilweise Erklärung dessen, was vor sich geht, aber die kurze und süße Version ist, dass F # wird Führen Sie einen beliebigen Wert für die Deklaration aus, wenn er keine Parameter akzeptiert.
%Vor% Da read
keine Parameter akzeptiert, wird es sofort bei der Deklaration ausgeführt und bindet den Rückgabewert der Funktion an den Bezeichner read
.
Übrigens ist Ihr Rückgabewert eine Funktion mit dem Typ (unit -> string)
. Dies liegt daran, dass F # Curries-Funktionen automatisch ausführt, wenn sie nicht alle Parameter übergeben haben. ReadLine
erwartet einen Einheitenparameter, aber da er nicht übergeben wird, binden Sie tatsächlich read
an die Funktion ReadLine
selbst.
Die Lösung ist wie folgt:
%Vor% Da read
einen Parameter benötigt, wird es bei jedem Aufruf neu ausgewertet. Außerdem übergeben wir einen Parameter an ReadLine
, andernfalls geben wir nur die Funktion ReadLine
als Wert zurück.
Ich verstehe, dass dies verwirrend sein kann. In Ihrem Beispiel läuft printfn
früher als Sie denken. Es wird tatsächlich auch ohne den Aufruf von read()
ausgeführt, d. H. Die letzten beiden Zeilen kommentieren, und Sie sehen immer noch, dass eine Nachricht gedruckt wird.
Ich denke, deine Intention ist etwa so:
%Vor%Dadurch wird eine "wiederverwendbare" Funktion erstellt, anstatt eine Funktion wie im ursprünglichen Beispiel an eine ID zu binden.
Als Nebenbemerkung ist die Verwendung von Semikolons hier optional, sodass Sie einfach schreiben können:
%Vor%Tags und Links f#