Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Haskell - Instanzen von Typklassen


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.

del_4901
2011-11-24, 00:03:12
Ich habe mir im Rahmen des Ai Contests selber Haskell beigebracht. Ist eine sehr coole Sprache uebrigens!

1.) Du kannst ja mal probieren die Prelude unter einem qualified Namen zu importieren, oder den + Operator explizit beim import rausnehmen.

2.) Es kann sein das Null schon belegt ist und er deswegen irgendwelch komisches matching macht.

3.) Die saubere Loesung ist es glaube ich das ganze ueber "class instances" zu machen, allerdings bin ich zusehr n00b um dir gute Tips geben zu koennen. Immerhin hast du die Buzzwords, und kannst mir vllt. das erklaeren. ;-) http://www.haskell.org/haskellwiki/OOP_vs_type_classes#Haskell_emulation_of_OOP_inheritance_with_record_extension

4.) Manchmal braucht der Compiler einfach explizite Typangaben, sonst sucht der such Tot

Der_Korken
2011-11-24, 12:52:35
Hab den Fehler gefunden: Ich musste ab der zweiten Zeile alles per Tab einrücken X-( Scheiß Compiler.