2010-03-13 4 views
9

Lorsque vous travaillez avec des instances dérivées dans Haskell, est-il possible de dériver des fonctions pour des types arbitraires ou sommes-nous limités à des fonctions particulières?Dérivation de fonctions arbitraires dans Haskell

+0

Héhé, +1 si vous avez trouvé cela parce que vous espériez que vous pourriez dériver 'Test.QuickCheck.Arbitrary' pour les ADT. :) –

Répondre

9

Vous pouvez dériver des instances des classes suivantes dans haskell 98: Eq, Ord, Enum, Ix, Bounded, Read et Show. En utilisant les extensions ghc, vous pouvez également dériver des instances des classes suivantes: Typeable, Data, Functor, Foldable et Traversable. Il y a aussi une extension ghc qui permet à un newtype de dériver des instances à partir de son type d'implémentation.

Vous ne pouvez pas dériver des instances de classes arbitraires pour la simple raison que haskell ne saurait pas générer les fonctions nécessaires sans une connaissance particulière de la classe en question.

+0

Mais GHC peut gérer quelques cas simples. Si vous dites 'newtype Bar = Bar Foo' et Foo a une instance Quux, alors GeneralizedNewtypeDeriving peut dériver l'instance Quux pour Bar pour vous. Bien sûr, c'est juste un déballage trivial, mais c'est mieux que rien. – jrockway

6

Vous êtes limité à des classes particulières, en termes de ce que le compilateur sait comment dériver pour vous. À l'aide d'un préprocesseur, ou modèle Haskell, vous pouvez vous-même coder de nouveaux mécanismes de dérivation, si vous connaissez des approches générales pour obtenir des implémentations de fonctions pour des types particuliers.

6

Les deux autres réponses sont correctes. Mais si vous avez besoin de plus, il existe des paquets sur le hackage qui peuvent gérer plus. J'aime beaucoup Data.Derive, puisque vous pouvez générer le code source directement (pour la compatibilité) ou l'accrocher dans Template Haskell pour le faire au moment de la compilation. Un large éventail de classes est déjà supporté, et il est très facile d'ajouter du support pour le vôtre. Résumé: pas de publicité pour une bibliothèque sacrément bien :-)

+0

Je prends maintenant cela en arrière. À l'époque, je n'avais pas essayé d'apporter mon soutien, mais j'ai supposé que c'était facile. Ce n'est pas; cela implique de recompiler la bibliothèque de ce que je peux dire. Mais encore le support intégré est agréable et complet. – luqui

4

Pour ajouter à la réponse de Don: dériver des fonctionnalités personnalisées pour les types de données est appelée generic programming et il y a un lot of literature à ce sujet. Les préprocesseurs et le modèle Haskell ne sont pas les seules solutions; Voir l'un des documents de synthèse cette liste de la littérature pour d'autres options.

Questions connexes