Gepostet: |
type "Objekt" instanzieren | ||||||||||
Hallo! Ich habe mit type eine "Klasse" geschrieben und möchte nun die "Methoden" mithilfe einer Instanz testen, aber wie geht das? Code sieht wie folgt aus:
Joa.. wie kann ich jetzt im Programmfenster ein Woerterbuch anlegen? Vielen Dank im Vorraus! |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Mit type definierst du nur einen Alias, z.B. um kompliziertere Typen abzukürzen, oder klarzumachen, was ein Typ "bedeutet" (also etwa Alter anstatt Int) Auf der rechten Seite steht String -> String, also eine Funktion, die aus einem String-Argument einen anderen String macht. Jede Funktion, die das erfüllt, kann als "Wörterbuch" übergeben werden. Eine ganz einfache Art, so eine Funktion zu schreiben, wäre mit pattern matching:
Damit kann man natürlich noch nicht einfügen oder entfernen, ich kann mir jetzt erst mal nicht vorstellen, wie das mit einer Funktion funktionieren soll. Viel logischer wäre, z.B. so etwas zu definieren:
Dann wären die von dir aufgeführten Operation leicht auszuführen. |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Bin noch neu was Haskell angeht... Testen könnte man die Funktionen beispielsweise mit lookup "two" (remove "two" en_de)oder lookup "house" (insert "house" "Haus" en_de) ahjo, danke! |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Nochmal: Deine Definition type Woerterbuch = String -> Stringdefiniert Wörterbuch als eine Funktion (im Prinzip als lookup-Funktion). Eine Funkion kann man nicht "ändern", also sehe ich keinen Weg, damit insert oder remove zu realisieren. Für solche Operationen brauchst du irgendwelche Datenstrukturen. "Klassen" im OO-Sinne gibt es in Haskell nicht. Wenn du Typklassen meinst, dann würden die ganz anders aussehen:
Dann könnte man eine geeignete Datenstruktur zu einer Wörterbuch-Instanz machen:
Als ich versucht habe, [(String,String)] direkt als Instanz zu verwenden, hat der Compiler gespuckt, deshalb der zusätzliche Dic-newtype um das Ganze herum. Mit Compileroptionen (hier -XFlexibleInstances) wollte ich nicht rumspielen. |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Aha, nach Rückfrage weiß ich jetzt, dass man, wenn man um obige Lösung mit newtype herumkommen will, wohl oder übel das FlexibleInstances Pragma braucht:
Hoffentlich wird dieses Verhalten bald in den Standard aufgenommen. |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Eine Funkion kann man nicht "ändern", also sehe ich keinen Weg, damit insert oder remove zu realisieren. Hat er/sie doch oben schon gemacht ;-) Wobei der Punkt hier ist, die vorhandene Funktion nicht zu ändern, sondern zu erweitern. Ein Wörterbuch lässt sich dann aus der Verkettung von solchen Funktionen erstellen: > let buch = insert "one" "eins" . insert "two" "zwei" . insert "three" "drei" $ empty Viele Grüße, Siracusa |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Ah, da stand ich ziemlich auf dem Schlauch, und hätte mir den Originalcode genauer angucken müssen. Ich nehme alles zurück und behaupte das Gegenteil... Na ja, wenigstens etwas über Typklassen gelernt, auch wenn es neben der Spur war. |
|||||||||||
Zum Seitenanfang | |||||||||||