Ich habe einen Datentyp Polynom r für Polynome in Haskell und eine Ring-Instanz dafür. (Die class Ring r where plus :: r -> r -> r ; times :: r -> r -> r ; negative :: r -> r ; zero :: r ; one :: r
- es ist nur eine vereinfachte Version von Num).Definieren eines Datentyps, der nicht definiert werden soll
nun ein Polynom wie gauss = x^2 + 1
oder eisenstein = x^2 + x + 1
und arbeiten dann in „Polynomial Integer/(Gauß)“ für die Gaußschen Zahlen oder „Polynomial Integer/(Eisenstein)“ für die Eisen ganzen Zahlen definieren ich konnte. Das ist das Problem, ich habe es in Anführungszeichen geschrieben, weil es kein richtiger Datentyp ist, und ich kann nicht herausfinden, wie man es definiert.
Ich versuchte zunächst so etwas wie data Quotient p = Quot p p
und dann zum Beispiel zu tun, würden wir plus (Quot a i) (Quot b i') | i == i' = Quot (plus a b) i
Natürlich haben diese schon ziemlich schlecht ist, aber es ist nicht einmal möglich one
und zero
zu definieren. Also habe ich es in data Quotient p = Quot p (Maybe p)
geändert und ich denke, ich habe eine funktionierende Implementierung, die das verwendet, aber Sie nie sicher wissen, ob plus
funktioniert (es benötigt mindestens eine Just
, und wenn es zwei sind, müssen sie gleich sein).
Gibt es irgendeine Art sicher (ich meine nicht mit unsicheren Funktionen) Weg, dies in Haskell zu programmieren? Ich bin ziemlich ratlos. Vielen Dank!
Ich denke, was Sie wirklich wollen, sind [abhängige Typen] (http://en.wikipedia.org/wiki/Dependent_type) (die in Haskell nicht existieren); Dies würde Ihnen erlauben, etwas wie "Datenquotient (p :: *) (q :: Polynomial r) = Quot p" zu sagen, wobei der Datentyp durch einen Wert parametrisiert wird. Es könnte eine Möglichkeit geben, es in diesem Fall zu emulieren, aber ich bin mir nicht sicher. –
Haben Sie sich das Numeric Prelude, http://hackage.haskell.org/package/numeric-prelude-0.2 angeschaut? Sie haben viel getan, um diese Art von Problemen zu lösen. –
@Antal, ich denke, Ihr 'Quotient' würde funktionieren, wenn Sie für jedes Polynom einen neuen Typ verwenden würden. Klingt jedoch wie ein Schmerz. –