Ich verwende das recht populäre FSharpx.Collections -Paket und insbesondere NichtEmptyList eingeben.
Dieser Typ stellt die Funktion NonEmptyList.cons
zur Verfügung, aber ich möchte den Operator ::
wie für reguläre List
verwenden, d. h. head :: tail
. Da tail
bereits ein NonEmptyList<'a>
sein muss, sollte es keinen Konflikt mit List
's ::
operator geben.
Es scheint jedoch, dass ich den Operator nicht definieren kann. Dies:
%Vor%führt zu einem Kompilierungsfehler:
%Vor% Ich weiß, dass ::
nicht ganz der gleichen Kategorie angehört wie andere Operatoren, aber ich verstehe wie nicht ganz. Also habe ich ein paar Dinge mehr oder weniger zufällig versucht, zum Beispiel ::
durch op_cons
und ähnliches zu ersetzen, ohne Erfolg.
Fehle ich etwas, und gibt es eine Möglichkeit zu tun, was ich tun möchte?
Laut MSDN , Kolon kann nicht wirklich in Namen des Bedieners verwendet werden. Dies scheint die F # Spezifikation von FSharp.org, ich bin nicht Sicher, was dort vorgeht. Aber wir können das in FSI überprüfen:
%Vor% Wenn man sich wie List<'T>
beträgt definiert , werden Sie, dass (::)
finden, ist nicht wirklich ein Operator, sondern ein Fall Konstruktor :
Und tatsächlich können Sie Ihren eigenen DU-Typ mit diesem als Konstruktornamen definieren:
%Vor%Nun, seltsam, wenn ich versuche, einen anderen Betreiber-ish aussehenden Namen wie Fall Konstruktor zu verwenden, erhalte ich diese Fehlermeldung:
%Vor% Was bedeutet, dass (::)
ist irgendwie besondere (und so% ist co_de%, übrigens).
So scheint das Endergebnis - nein, das kannst du nicht tun.
Aber warum musst du überhaupt? Können Sie sich vielleicht mit einem akzeptableren Operatornamen begnügen, der immer noch die Semantik von "const" ausdrückt - wie etwa ([])
?
Tags und Links f#