10 Stimmen

Ableitung beliebiger Funktionen in Haskell

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?

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. :)

10voto

sepp2k Punkte 352762

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.

6voto

Don Stewart Punkte 136046

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.

6voto

luqui Punkte 58358

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 :-)

4voto

Martijn Punkte 6645

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X