Definieren Sie den Cons (:) Operator für benutzerdefinierte Sammlungen

8

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?

    
piaste 30.08.2015, 14:24
quelle

1 Antwort

8

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 :

%Vor%

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 ([]) ?

    
Fyodor Soikin 30.08.2015, 15:14
quelle

Tags und Links