Gepostet: |
Drei kleine Einsteigerfragen | ||||||||||
Hallo! Ich versuche gerade Haskell zu lernen und stehe ein wenig bei den Klassen und Typen an. Ich habe drei kleine Fragen: 1. Warum funktioniert der Code class Test a where id :: a -> a id a = a instance Num a => Test [a] so schon, aber nicht mit "... Test a" in der letzten Zeile? Warum kann ich nicht direkt alle Instanzen einer Klasse zu Instanzen einer anderen Klasse machen, aber trotzem alle Instanzen eines polymorphen Typen? 2. Ich habe mal in einem Code eine Syntax in der Art von test :: a -> b a gesehen. Der Compiler nimmt sowas auch an, aber ich habe nirgends herausgefunden wie das zu lesen ist. 3. Nochmal ein ähnlicher Code wie im ersten Beispiel: class Test a where id :: a -> a id a = a instance Test Int Nun bekomme ich bei der Eingabe "id 5" den Fehler "Unresolved overloading". Mir ist klar dass "5" nicht von Typ Int ist sondern es sich dabei um eine polymorphe Konstante handelt. Aber ist das nicht trotzdem der selbe Fall bei dem Operator (/)? Der Typ von (/) ist Fractional a => a -> a -> a und bei der Eingabe 5/5 bekomme ich ein Ergebnis. Das macht auch Sinn, weil alle Instanzen von Fractional auch Instanzen von Num sind, und 5 von der Klasse Num ist. Aber sollte ich dann nicht mit einer ähnlichen Argumentation auch bei "id 5" ein Ergebnis bekommen, weil Int eine Instanz von Num ist? Würde mich freuen, wenn Ihr mir ein wenig helfen könnt, in Hasell besser reinzukommen. |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
OK, den zweiten Punkt habe ich mir mittlerweile beantworten können (: aber die anderen beiden noch nicht. | |||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Deine Probleme kommen daher, dass die Funktion id schon definiert ist: http://www.haskell.org/hoogle/?hoogle=id Benenne sie in irgend etwas anderes um (z.B. identity) bevor du weiter rumprobierst. |
|||||||||||
Zum Seitenanfang | |||||||||||