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
Répondre
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.
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
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.
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 :-)
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
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.
- 1. Haskell: fonctions polymorphes explication
- 2. Envoi de données arbitraires via plusieurs fonctions
- 3. vb.net - Fonctions et génériques typés arbitraires
- 4. Ajout de fonctions arbitraires aux objets dom dans javascript/jquery
- 5. données de tuyauterie par des fonctions arbitraires dans Clojure
- 6. Monades et fonctions traversal personnalisés dans Haskell
- 7. Haskell surveille les fonctions lambda?
- 8. examen des fonctions internes de Haskell
- 9. Fonction Haskell et fonctions de désassemblage
- 10. Dérivation de UserControl dans Silverlight
- 11. Optimisations pour une série de fonctions dans Haskell
- 12. Ajout de dérivation (Données) aux types standard
- 13. Dérivation interfaces COM dans .NET
- 14. Comment exécuter une séquence d'opérations (fonctions) dans Haskell?
- 15. Dérivation nom de la fonction
- 16. Dérivation de types génériques spécialisés
- 17. Dérivation de tableaux en mathématiques
- 18. Recursion de queue dans Haskell
- 19. grammaire BNF Dérivation
- 20. C# Dérivation Méthodes génériques
- 21. importation Liste dans haskell
- 22. Comment activer la dérivation dans VSS
- 23. Casting dans Haskell
- 24. Motifs de type dans Haskell
- 25. Serveur XMLRPC Haskell exécutant des fonctions générées dynamiquement
- 26. Meilleure façon d'appeler des fonctions Haskell depuis Java
- 27. WCF - contrats de service de séparation et dérivation partielle?
- 28. (émulé) Macros dans Haskell?
- 29. Représentation de hiérarchies arbitraires dans WADL
- 30. Enveloppe de mots arbitraires dans IE
Héhé, +1 si vous avez trouvé cela parce que vous espériez que vous pourriez dériver 'Test.QuickCheck.Arbitrary' pour les ADT. :) –