F # -Typkonstruktoren verstehen

7

Ich versuche einen komplexen Typ zu erstellen und benötige zur Konstruktionszeit einige Aktionen. Also fing ich an, meinen Code zu schreiben:

%Vor%

Nun, wenn man versucht, ein for oder etwas anderes aus einer Aufgabe zu setzen, wird der Compiler verrückt. Ich nehme folgendes an: Die Syntax für new folgt der von Computational Expressions, oder besser, die neue ist ein Berechnungsausdruck (ich unterziehe das wegen der geschweiften Klammern und des Semikolons von einer Anweisung zur anderen). Und in diesem Fall ist es für Konstruktor-Berechnungsausdrücke möglich, nur Zuweisungen zu platzieren.

Also könnten Sie mir bitte antworten:

1) Ist mein Abzug korrekt? (bezüglich computational Ausdrücke und der Konstruktor für Typen).

2) Was soll ich tun, wenn ich einen artikulierten Satz von Anweisungen im Konstruktor ausführen muss? Nun, weißt du, manchmal ist es notwendig, eine Aktion zur Konstruktionszeit auszuführen und es kann alles von einem Zyklus bis zu allen Möglichkeiten beinhalten.

Aber der Compiler wird sowieso verrückt ...

Dank kvd habe ich verstanden, dass ich folgende Möglichkeiten habe:

%Vor%

Nun, es tut mir leid, aber das hilft mir nicht, weil der F # -Compiler mir das sagt:

  

Objektkonstruktoren können nicht direkt   Verwenden Sie versuchen / mit und versuchen Sie / schließlich vor   die Initialisierung des Objekts. Dies   enthält Konstruktoren wie 'für x   in ... "das kann zu Anwendungen von   diese Konstrukte. Dies ist eine Einschränkung   von Common IL auferlegt.

OK, wenn das Problem etwas vor der Initialisierung des Objekts tut, und es klingt korrekt, dann machen wir das nach:

%Vor%

Wieder durch Fehler frustriert:

  

Der Wert oder Konstruktor 'myvar' ist   nicht definiert.

Was soll ich tun ???? Es scheint, dass, nachdem es Elemente in meiner Klasse nicht erkennt, es richtig scheint, weil es einen Identifizierer wie für das Erklären von Mitgliedern erfordern würde, die self oder this verwenden ... hier hat es keine Selbstreferenz und sagt mir richtig : "Du versuchst etwas zu bekommen, was ich dir nicht geben kann !!!!!!"

    
Andry 15.02.2011, 20:06
quelle

2 Antworten

13
___ qstnhdr ___ F # -Typkonstruktoren verstehen ___ tag123syntax ___ Syntax bezieht sich auf die eigentlichen Sprachelemente und Symbole selbst. Fragen sollten als Syntax gekennzeichnet werden, wenn sich die Frage spezifisch und fast vollständig auf die Syntax bezieht. Dieses Tag sollte mit einem bestimmten Sprach-Tag verwendet werden ___ qstntxt ___

Ich versuche einen komplexen Typ zu erstellen und benötige zur Konstruktionszeit einige Aktionen. Also fing ich an, meinen Code zu schreiben:

%Vor%

Nun, wenn man versucht, ein for oder etwas anderes aus einer Aufgabe zu setzen, wird der Compiler verrückt. Ich nehme folgendes an: Die Syntax für new folgt der von Computational Expressions, oder besser, die neue ist ein Berechnungsausdruck (ich unterziehe das wegen der geschweiften Klammern und des Semikolons von einer Anweisung zur anderen). Und in diesem Fall ist es für Konstruktor-Berechnungsausdrücke möglich, nur Zuweisungen zu platzieren.

Also könnten Sie mir bitte antworten:

1) Ist mein Abzug korrekt? (bezüglich computational Ausdrücke und der Konstruktor für Typen).

2) Was soll ich tun, wenn ich einen artikulierten Satz von Anweisungen im Konstruktor ausführen muss? Nun, weißt du, manchmal ist es notwendig, eine Aktion zur Konstruktionszeit auszuführen und es kann alles von einem Zyklus bis zu allen Möglichkeiten beinhalten.

Aber der Compiler wird sowieso verrückt ...

Dank kvd habe ich verstanden, dass ich folgende Möglichkeiten habe:

%Vor%

Nun, es tut mir leid, aber das hilft mir nicht, weil der F # -Compiler mir das sagt:

  

Objektkonstruktoren können nicht direkt   Verwenden Sie versuchen / mit und versuchen Sie / schließlich vor   die Initialisierung des Objekts. Dies   enthält Konstruktoren wie 'für x   in ... "das kann zu Anwendungen von   diese Konstrukte. Dies ist eine Einschränkung   von Common IL auferlegt.

OK, wenn das Problem etwas vor der Initialisierung des Objekts tut, und es klingt korrekt, dann machen wir das nach:

%Vor%

Wieder durch Fehler frustriert:

  

Der Wert oder Konstruktor 'myvar' ist   nicht definiert.

Was soll ich tun ???? Es scheint, dass, nachdem es Elemente in meiner Klasse nicht erkennt, es richtig scheint, weil es einen Identifizierer wie für das Erklären von Mitgliedern erfordern würde, die self oder this verwenden ... hier hat es keine Selbstreferenz und sagt mir richtig : "Du versuchst etwas zu bekommen, was ich dir nicht geben kann !!!!!!"

    
___ tag123f ___ F # ist eine prägnante, ausdrucksstarke und effiziente funktionale und objektorientierte Sprache für .NET, mit der Sie einfachen Code zur Lösung komplexer Probleme schreiben können. ___ tag123constructor ___ Eine spezielle Art von Subroutine, die bei der Erstellung eines Objekts aufgerufen wird. ___ antwort5008999 ___
  1. Nein, Ihre Schlussfolgerung ist nicht korrekt. Die geschweiften Klammern ähneln eher einem Datensatzkonstruktausdruck, der nur Feldzuweisungen enthalten kann. Sie können nichts anderes tun, als jedem Feld innerhalb der geschweiften Klammern Werte zuzuweisen.

  2. Sie können Anweisungen vor den Feldzuweisungen (also vor der öffnenden Klammer) wie gewohnt ablegen. Wenn Sie danach weitere Anweisungen ausführen möchten, müssen Sie das Schlüsselwort then verwenden:

    %Vor%

Bearbeiten

Bezüglich Ihrer neuen Frage können Sie new (ctorpar:AnotherType) as this = ... und dann this.myvar <- 10 verwenden.

    
___ answer5010071 ___

Die Antwort von kvb ist großartig und gibt Ihnen alle Informationen, die Sie gefragt haben: -).

Ich würde nur empfehlen, die implizite Syntax zu verwenden, bei der der primäre Konstruktor unmittelbar nach dem Namen des Typs geschrieben wird. Das macht vieles einfacher:

%Vor%     
___ tag123net ___ Das .NET-Framework ist ein Software-Framework, das hauptsächlich für das Microsoft Windows-Betriebssystem entwickelt wurde. Es enthält eine Implementierung der Basisklassenbibliothek, Common Language Runtime (allgemein als CLR bezeichnet), Common Type System (allgemein als CTS bezeichnet) und Dynamic Language Runtime. Es unterstützt viele Programmiersprachen, einschließlich C #, VB.NET, F # und C ++ / CLI. NICHT für Fragen zu .NET Core verwenden. ___
kvb 15.02.2011 20:16
quelle
9

Die Antwort von kvb ist großartig und gibt Ihnen alle Informationen, die Sie gefragt haben: -).

Ich würde nur empfehlen, die implizite Syntax zu verwenden, bei der der primäre Konstruktor unmittelbar nach dem Namen des Typs geschrieben wird. Das macht vieles einfacher:

%Vor%     
Tomas Petricek 15.02.2011 22:04
quelle

Tags und Links