Definieren von Modulen VS.NET vs F # Interactive

8

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?

    
Knows Not Much 28.08.2012, 09:07
quelle

2 Antworten

14

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:

%Vor%

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

    
Jack P. 28.08.2012, 13:12
quelle
6

Die übliche Lösung besteht darin, das erste Beispiel beizubehalten und eine fsx -Datei zu erstellen, die auf das Modul verweist:

%Vor%

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 :

%Vor%

funktioniert sowohl für fsi als auch für fsc.

    
pad 28.08.2012 09:30
quelle

Tags und Links