Ist es bei der Arbeit mit abgeleiteten Instanzen in Haskell möglich, Funktionen für beliebige Typen abzuleiten, oder sind wir auf bestimmte Funktionen beschränkt?
Antworten
Zu viele Anzeigen?Sie können Instanzen der folgenden Klassen in haskell 98 ableiten: Eq, Ord, Enum, Ix, Bounded, Read und Show.
Mit ghc extensions können Sie auch Instanzen der folgenden Klassen ableiten: Typeable, Data, Functor, Foldable und Traversable. Es gibt auch eine ghc-Erweiterung, die es einem newtype erlaubt, Instanzen von seinem Implementierungstyp abzuleiten.
Man kann keine Instanzen beliebiger Klassen ableiten, und zwar aus dem einfachen Grund, dass Haskell nicht weiß, wie man die notwendigen Funktionen ohne spezielles Wissen über die betreffende Klasse generiert.
Sie sind auf bestimmte Klassen beschränkt, und zwar in Bezug auf das, was der Compiler für Sie ableiten kann. Mit einem Präprozessor oder Template Haskell können Sie selbst neue Ableitungsmechanismen programmieren, wenn Sie allgemeine Ansätze kennen, um Implementierungen von Funktionen für bestimmte Typen zu erzeugen.
Die beiden anderen Antworten sind richtig. Aber wenn Sie mehr brauchen, gibt es einige Pakete auf Hackage, die mehr verarbeiten können. Ich mag Daten.Ableiten viel, da Sie den Quellcode direkt generieren können (aus Kompatibilitätsgründen) oder ihn in Template Haskell einbinden können, um ihn zur Kompilierzeit zu erzeugen. Eine breite Palette von Klassen wird bereits unterstützt, und es ist sehr einfach, Unterstützung für Ihre eigenen hinzuzufügen. Fazit: Werbespot für eine verdammt gute Bibliothek :-)
Um Dons Antwort zu ergänzen: Das Ableiten von benutzerdefinierten Funktionen für Datentypen wird als _generische Programmierung_ und es gibt eine eine Menge Literatur darüber. Präprozessoren und Template Haskell sind nicht die einzigen Lösungen; siehe eines der Übersichtspapiere, die die Literatur auflisten, für andere Optionen.
2 Stimmen
Hehe, +1, wenn du das hier gefunden hast, weil du gehofft hast, dass du es ableiten kannst
Test.QuickCheck.Arbitrary
für ADTs. :)