Haskell - arithmetische Operatoren neu definieren (verstecken)

8

Ich möchte mehrere arithmetische Operatoren in Haskell neu definieren, um sie erweiterbarer und allgemeiner zu machen.

z. B.

%Vor%

Dies scheint in Kombination mit

zu funktionieren %Vor%

versteckt den Standardoperator * . Aber natürlich müssen alle üblichen Multiplikationen auch funktionieren, also müsste ich etwas wie

definieren %Vor%

Wie kann ich hier auf den ursprünglichen Operator * ( Prelude.(*) funktioniert nicht) zugreifen und wie muss ich den Instanztyp so definieren, dass 1 * 1 nicht in Konflikt mit der Monomorphism Restriction ?

Bearbeiten -

%Vor%

ist ein guter Tipp, danke.

Aber leider zwang mich das dazu, alle Standardmethoden explizit in den Geltungsbereich zu bringen. Ich möchte nur die Möglichkeit haben, bestimmte Bindungen neu zu definieren und den Rest unverändert zu lassen.

Gibt es also eine Kombination aus beidem? Etwas wie

%Vor%     
Dario 05.03.2010, 17:22
quelle

4 Antworten

23

Beantworten der bearbeiteten Frage:

Sie können

tun %Vor%

um Zugang zu allen Prelude-Funktionen mit Ausnahme von (*) auf die übliche Weise und zu (*) über das Präfix P :

zu erhalten %Vor%     
Michał Marczyk 05.03.2010, 18:03
quelle
4

Die Instanz

%Vor%

Wird den Zweck der Definition von Mul t t t in erster Linie zunichte machen, ohne Erweiterungen zu missbrauchen, um {-# LANGUAGE OverlappingInstances #-} zuzulassen.

Leider ist die 'richtige', wenn schmerzhafte Antwort, Instanz für Instanz durchzugehen und zu tun

%Vor%

Andernfalls wird die Art und Weise, wie diese Instanzköpfe im Compiler aufgelöst werden (kein Backtracking erfolgt), dazu führen, dass Ihre neuen Instanzen dazu führen, dass die Kompilierung explodiert, wenn Sie sie tatsächlich verwenden.

Das heißt, Sie können den Schmerz zumindest für Fälle lindern, an die Sie nicht gedacht haben:

%Vor%

Das wird zumindest zulassen, dass sie nur Ihren newtype-Wrapper verwenden, wenn sie nicht möchten, dass Mul und alle anderen Klassen selbst definiert werden.

    
Edward KMETT 07.03.2010 07:41
quelle
3

Es gab ein paar Versuche, solche Dinge zu tun.

Erstens,

  

Wie kann ich auf den ursprünglichen * Operator zugreifen (Prelude. (*) funktioniert nicht)

Sie müssen:

%Vor%

Jetzt können Sie z. (Auftakt.*). Dies ist weniger aggressiv als "LANGUAGE NoImplicitPrelude", was auch lokale Verwendungen von & gt; & gt; = usw. zur Folge hat, die zu Ihren Definitionen zurückkehren.

Hier sind Beispiele für alternative Präludien anderer Leute:

Don Stewart 05.03.2010 17:34
quelle
2

Ich kann die erste Frage beantworten. Versteckt den (*) Operator wirklich versteckt es, so dass Sie nicht darauf kommen. Sie können jedoch Prelude-qualifiziert importieren:

%Vor%

Ich denke, dass das tut, was Sie wollen.

    
tredontho 05.03.2010 17:40
quelle