Je comprends pas pourquoi vous voulez le faire, mais malheureusement, il est peut-être qu'une illusion que Haskell classes semblent être "ouvert" dans le sens que vous dites. Beaucoup de personnes estiment que la possibilité de faire cela est un bug dans le Haskell spécification, pour des raisons que je vais expliquer ci-dessous. De toute façon, si ce n'est pas vraiment approprié pour l'instance, vous devez être déclarée dans le module où la classe est déclarée ou dans le module où le type est déclaré, qui est probablement un signe que vous devriez être à l'aide d'un newtype
ou certains autres wrapper autour de votre type.
Les raisons de l'orphelin instances doivent être évités exécuter beaucoup plus profond que de la commodité du compilateur. Ce sujet est assez controversée, comme vous pouvez le voir à partir d'autres réponses. Pour équilibrer le débat, je vais vous expliquer le point de vue que l'on ne doit jamais, jamais, écrire orphelin cas, je pense que c'est l'opinion de la majorité entre les expérimentés Haskellers. Mon opinion personnelle est quelque part au milieu, que j'expliquerai à la fin.
Le problème vient du fait que lorsque plus d'un exemple, la déclaration existe pour la même catégorie et le type, il n'y a pas de mécanisme standard Haskell pour spécifier les utiliser. Plutôt, le programme est rejeté par le compilateur.
Le plus simple effet de cette est que vous pourriez avoir à merveille un programme de travail qui s'arrêtent subitement de la compilation en raison d'un changement de quelqu'un d'autre fait, dans certains loin de dépendance de votre module.
Encore pire, il est possible pour un programme de travail pour commencer à s'écraser lors de l'exécution à cause d'un lointain changement. Vous pourriez être en utilisant une méthode que vous êtes en supposant que vient à partir d'un certain exemple, la déclaration, et il pourrait en silence sera remplacée par une autre instance qui est juste assez différents à cause de votre programme pour démarrer inexplicablement s'écraser.
Les gens qui veulent des garanties que ces problèmes ne sera jamais survenir doivent suivre la règle que si n'importe qui, n'importe où, n'a jamais déclaré une instance d'une certaine classe d'un certain type, aucune autre instance ne doit être déclarée à nouveau dans un programme écrit par n'importe qui. Bien sûr, il y a la solution d'utiliser un newtype
à déclarer une nouvelle instance, mais qui est toujours d'au moins un inconvénient mineur, et parfois majeur.
Ainsi, dans ce sens, ceux qui écrivent des orphelins cas intentionnellement sont plutôt impoli.
Donc, ce qui devrait être fait à propos de ce problème? L'anti-orphelin-instance camp dit que le GHC avertissement est un bug, il doit être une erreur qui rejette toute tentative de déclarer un orphelin de l'instance. En attendant, nous devons faire preuve d'auto-discipline et de les éviter à tout prix.
Comme vous l'avez vu, il y a ceux qui ne sont pas tellement préoccupés par ces problèmes potentiels. Ils encouragent en fait l'utilisation de telles instances comme un outil pour la séparation des préoccupations, comme vous le suggérez, et dire que l'on devrait assurez-vous juste au cas par cas qu'il n'y a pas de problème. J'ai été incommodés assez de fois par d'autres personnes de l'orphelin instances pour être convaincu que cette attitude est trop cavalier.
Je pense que la bonne solution serait d'ajouter une extension à Haskell d'importation du mécanisme de contrôle de l'importation de cas. Qui ne résoudrait pas les problèmes de fond, mais cela donnerait un peu d'aide en faveur de la protection de nos programmes contre les dommages de l'orphelin instances qui existent déjà dans le monde. Et puis, avec le temps, je pourrais devenir convaincu que, dans certains cas limités, peut-être un orphelin exemple, pourrait ne pas être si mauvais. (Et que la tentation est la raison pour laquelle certains dans la lutte anti-orphelin-instance de camp sont à l'opposé de ma proposition.)
Ma conclusion de tout cela est que, au moins pour le moment, je conseille vivement d'éviter de déclarer tout orphelin cas, à être attentif aux autres, si pour aucune autre raison. Utiliser un newtype
.