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
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%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
:
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.
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:
Tags und Links haskell syntax functional-programming notation