Ich habe diesen Code geschrieben, der perfekt in VS.NET 2010 kompiliert und funktioniert
%Vor%aber wenn ich ein Steuerelement + A und Alt + Enter, um dies an FSI zu senden, bekomme ich einen Fehler
ConfigHandler.fs (2,1): Fehler FS0010: Unerwarteter Start des strukturierten Konstrukts in der Definition. Erwartetes '=' oder anderes Token.
OK.
Also ändere ich meinen Code in
%Vor%Jetzt Control + A, Alt + Enter ist erfolgreich und I FSI sagt mir nett
Modul ConfigHandler = begin val GetConnectionString: Zeichenfolge - & gt; Zeichenfolge Ende
Aber jetzt, wenn ich versuche, meinen Code in VS.NET 2010 zu kompilieren, bekomme ich eine Fehlermeldung
Dateien in Bibliotheken oder Anwendungen mit mehreren Dateien müssen mit einem Namespace oder einer Moduldeklaration beginnen, z. 'Namespace SomeNamespace.SubNamespace' oder 'Modul SomeNamespace.SomeModule'
Wie kann ich beides haben? Möglichkeit, in VS.NET zu kompilieren und Module an FSI zu senden?
Es gibt einen winzigen - aber entscheidenden - Unterschied zwischen Ihren zwei Codeschnipsel, der hier verantwortlich ist.
F # hat zwei Möglichkeiten, ein module
zu deklarieren. Der erste, ein "Top-Level-Modul", wird wie folgt deklariert:
Die andere Möglichkeit, ein Modul zu deklarieren, ist wie bei einem lokalen Modul:
%Vor% Die Hauptunterschiede zwischen den Deklarationen "top-level" und "local" bestehen darin, dass auf die lokale Deklaration ein =
-Zeichen und der Code innerhalb eines "lokalen" Moduls muss eingerückt werden .
Der Grund, warum Sie die Nachricht ConfigHandler.fs(2,1): error FS0010: Unexpected start of structured construct in definition. Expected '=' or other token.
für das erste Snippet erhalten haben, ist, dass Sie Module der obersten Ebene in fsi
nicht deklarieren können.
Wenn Sie das =
-Zeichen zu Ihrer Moduldefinition hinzugefügt haben, wurde es von einem Modul der obersten Ebene in ein lokales Modul geändert. Von dort haben Sie den Fehler Files in libraries or multiple-file applications must begin with a namespace or module declaration, e.g. 'namespace SomeNamespace.SubNamespace' or 'module SomeNamespace.SomeModule'
erhalten, weil lokale Module in einem Modul der obersten Ebene oder einem Namespace verschachtelt sein müssen. Mit fsi
können Sie keine Namespaces (oder Top-Level-Module) definieren. Wenn Sie also die gesamte Datei in fsi
kopieren und einfügen möchten, funktioniert das nur, wenn Sie die Kompilierungsanweisungen als @ verwenden. Pad erwähnt. Andernfalls können Sie die lokalen Moduldefinitionen (ohne den enthaltenden Namespace) einfach in fsi
kopieren und sie sollten wie erwartet funktionieren.
Referenz: Module (F #) in MSDN
Die übliche Lösung besteht darin, das erste Beispiel beizubehalten und eine fsx
-Datei zu erstellen, die auf das Modul verweist:
Sie haben den Vorteil, mehrere Module zu laden und Installationscode für das Experiment zu schreiben.
Wenn Sie ConfigHandler.fs
wirklich direkt in F # Interactive laden möchten, können Sie INTERACTIVE
symbol und Compiler-Richtlinien :
funktioniert sowohl für fsi als auch für fsc.
Tags und Links f# f#-interactive