Der_Korken
2011-11-23, 23:42:36
Eins vorweg: Ich bin Haskell-Anfänger, deswegen bitte etwas Nachsicht^^
Ich sitze gerade an einer Übungsaufgabe (ja ich weiß ...) und habe Probleme mit dem Definieren einer Instanz der Typklasse Num. Wenn ich beispielsweise für meine selbstgeschriebene Datenstruktur eine Addition definieren will, bekomme ich beim Kompilieren eine Fehlermeldung, dass der Operator "+" nun mehrdeutig ist.
Die Datenstruktur sieht so aus:
data Nat = Null | Succ Nat
Und soll einfach nur natürliche Zahlen darstellen. Nat ist bereits Instanz der Typklassen Show und Eq (das hab ich noch hinbekommen).
Jetzt will ich aber wie gesagt auch noch Rechenoperationen für Nat definieren und ich habe so angefangen:
instance Num Nat where
a + Null = a
a + (Succ b) = (Succ a) + b
In der unteren Zeile meckert aber nun der Kompiler, dass mit "+" entweder das vordefinierte "+" für Integer gemeint sein könnte, oder eben mein selbstdefinierter "+"-Operator in der Zeile darüber.
Komplette Fehlermeldung (wo auch schon "*" und "-" definiert sind):
blatt05.lhs:40:41:
Ambiguous occurrence `+'
It could refer to either `Main.+', defined at blatt05.lhs:51:5
or `Prelude.+', imported from Prelude
blatt05.lhs:52:27:
Ambiguous occurrence `+'
It could refer to either `Main.+', defined at blatt05.lhs:51:5
or `Prelude.+', imported from Prelude
blatt05.lhs:54:20:
Ambiguous occurrence `+'
It could refer to either `Main.+', defined at blatt05.lhs:51:5
or `Prelude.+', imported from Prelude
blatt05.lhs:54:25:
Ambiguous occurrence `*'
It could refer to either `Main.*', defined at blatt05.lhs:53:5
or `Prelude.*', imported from Prelude
blatt05.lhs:57:27:
Ambiguous occurrence `-'
It could refer to either `Main.-', defined at blatt05.lhs:55:8
or `Prelude.-', imported from Prelude
blatt05.lhs:62:51:
Ambiguous occurrence `fromInteger'
It could refer to either `Main.fromInteger',
defined at blatt05.lhs:62:3
or `Prelude.fromInteger', imported from Prelude
blatt05.lhs:62:65:
Ambiguous occurrence `-'
It could refer to either `Main.-', defined at blatt05.lhs:55:8
or `Prelude.-', imported from Prelude
Jetzt weiß ich nicht, was ich dagegen tun kann. Imho müsste das so eigentlich funktionieren, da die Standardbibliothek wohl kaum eine "+"-Operation für meinen selbstdefinierten Datentyp kennt, andererseits überschreibe ich auch keine vorhandene "+"-Operation, da ich ich diese ja nur für Nat definiere. Kann ich dem Compiler das irgendwie noch expliziter mitteilen, was ich will? Habe schon Kommilitionen gefragt und im Skript geschaut, aber nichts hilfreiches gefunden.
Ich sitze gerade an einer Übungsaufgabe (ja ich weiß ...) und habe Probleme mit dem Definieren einer Instanz der Typklasse Num. Wenn ich beispielsweise für meine selbstgeschriebene Datenstruktur eine Addition definieren will, bekomme ich beim Kompilieren eine Fehlermeldung, dass der Operator "+" nun mehrdeutig ist.
Die Datenstruktur sieht so aus:
data Nat = Null | Succ Nat
Und soll einfach nur natürliche Zahlen darstellen. Nat ist bereits Instanz der Typklassen Show und Eq (das hab ich noch hinbekommen).
Jetzt will ich aber wie gesagt auch noch Rechenoperationen für Nat definieren und ich habe so angefangen:
instance Num Nat where
a + Null = a
a + (Succ b) = (Succ a) + b
In der unteren Zeile meckert aber nun der Kompiler, dass mit "+" entweder das vordefinierte "+" für Integer gemeint sein könnte, oder eben mein selbstdefinierter "+"-Operator in der Zeile darüber.
Komplette Fehlermeldung (wo auch schon "*" und "-" definiert sind):
blatt05.lhs:40:41:
Ambiguous occurrence `+'
It could refer to either `Main.+', defined at blatt05.lhs:51:5
or `Prelude.+', imported from Prelude
blatt05.lhs:52:27:
Ambiguous occurrence `+'
It could refer to either `Main.+', defined at blatt05.lhs:51:5
or `Prelude.+', imported from Prelude
blatt05.lhs:54:20:
Ambiguous occurrence `+'
It could refer to either `Main.+', defined at blatt05.lhs:51:5
or `Prelude.+', imported from Prelude
blatt05.lhs:54:25:
Ambiguous occurrence `*'
It could refer to either `Main.*', defined at blatt05.lhs:53:5
or `Prelude.*', imported from Prelude
blatt05.lhs:57:27:
Ambiguous occurrence `-'
It could refer to either `Main.-', defined at blatt05.lhs:55:8
or `Prelude.-', imported from Prelude
blatt05.lhs:62:51:
Ambiguous occurrence `fromInteger'
It could refer to either `Main.fromInteger',
defined at blatt05.lhs:62:3
or `Prelude.fromInteger', imported from Prelude
blatt05.lhs:62:65:
Ambiguous occurrence `-'
It could refer to either `Main.-', defined at blatt05.lhs:55:8
or `Prelude.-', imported from Prelude
Jetzt weiß ich nicht, was ich dagegen tun kann. Imho müsste das so eigentlich funktionieren, da die Standardbibliothek wohl kaum eine "+"-Operation für meinen selbstdefinierten Datentyp kennt, andererseits überschreibe ich auch keine vorhandene "+"-Operation, da ich ich diese ja nur für Nat definiere. Kann ich dem Compiler das irgendwie noch expliziter mitteilen, was ich will? Habe schon Kommilitionen gefragt und im Skript geschaut, aber nichts hilfreiches gefunden.