Diskussion:Funktionale Programmierung mit Haskell/ Typklassen
Letzter Kommentar: vor 9 Jahren von Daniel5Ko in Abschnitt Anmerkungen
Anmerkungen
BearbeitenEs wird leider immer noch vieles falsch erklärt, und der ganze Ansatz dieses Kapitels ist irgendwie seltsam. Daher hier mal wild vermischte ein paar Story-Board-Items und Anmerkungen, zum Diskutieren o.ä.:
- Man kann in Haskell polymorphe Funktionen schreiben, die auf allen Datentypen funktionieren.
- Manchmal will man aber auch generische Funktionen schreiben, die gar nicht auf allen Typen funktionieren können, weil Spezial-Funktionalität (zusammen mit Gesetzen, die allerdings bestenfalls in der Doku stehen und nicht gecheckt werden) benötigt wird. Genau hierfür sind Typklassen gut. Die Generizität wird eben auf die Typen eingeschränkt, die eine gewissen Funktionalität bieten.
- Beispiel: Zum Rechnen mit ringartigen Dingen ist
Num
da. Was Matrizen über einem Ring R sind, und wie man damit rechnet, und dass die Matrizen selbst wieder einen Ring bilden, kann man allgemein in Haskell ausdrücken. Eine solche Rekursivität hat man natürlich auch beiEq, Ord, Show
etc. - Typklassen definieren nur Methodensignaturen, und selbst keine konkreten Implementierungen. Dass ein bestimmter Typ (ggf. parametriert) die zu einer Typklasse gehörende Funktionalität hat, wird durch eine Instanz-Deklaration "bewiesen" -- und die enthält dann eine Implementierung.
- Wie eine Klassendefinition aussieht, und wie eine instanzdeklaration aussieht, sollte erwähnt werden. Dies bildet doch einen brauchbaren Kern, um den man den weiteren Text stricken könnte.
- Für einige Klassen- und Typ-Kombinationen können Instanzen automatisch hergeleitet werden (dafür ist
deriving
da). In Haskell 98 sind das u.a. die KlassenEq,Ord,Show,Enum
, für alle benutzerdefinierten Typen, die als Bestandteile nur Instanzen dieser Klassen haben. Darüberhinaus bietet GHC ein paar Extensions, die weitere automatische Herleitungen erlauben. - Wichtig ist aber, dass es oft nicht "die" richtige Typklasseninstanz gibt -- es kann also sein, dass man mehrere haben will (Stichwort Monoid mit Träger ). U.a. dafür ist
newtype
gut. - Oft interessante Typklassen wie
Functor,Monad,Applicative
, sollten erwähnt werden.
Gruß, --Daniel5Ko 20:50, 4. Dez. 2014 (CET)
Danke für die Anmerkungen. Ich berücksichtige sie, wenn ich die Seite wieder überarbeite.
Aber ich möchte in meine Erklärungen keine algebraischen Begriffe einbringen. Erstens liegen meine Algebra-Vorlesungen ein paar Jahre zurück, und zweitens möchte ich den Text bewusst auch für Nicht-Mathematiker verständlich halten (Die Unis haben ihre eigenen Haskell-Tutorials).
Und ja, es fehlt noch viel. Ich bin dran. Grüße, --Ladon 13:19, 5. Dez. 2014 (CET)
- Danke für deine Mühen. Ich habe mir mal erlaubt, meinen Beitrag ein wenig zu korrigieren, auch wenn schon darauf reagiert wurde. Grüße, --Daniel5Ko 23:15, 5. Dez. 2014 (CET)