pourrait ORD code> et ENUM CODE> Soyez un typclass? Pourquoi ne Enum code> nécessite-t-il eq code>? P>
3 Réponses :
comme pour Enum code> représente des types pouvant être mappés vers / des entiers. Cela ne dit rien de la manière dont ces types doivent être triés, simplement que vous pouvez les représenter avec des entiers. P>
ord code> représente des types commandés. Ceci est différent des types pouvant être mappés en entiers. Par exemple, vous ne pouvez pas mapper des valeurs de point flottant arbitraires-précision aux entiers, mais vous pouvez les commander. Et pendant que vous pourriez techniquement essayer de planer des flotteurs aux entiers, personne dans son esprit droit ne le ferait. P>
eq code>, ord code> exige cela car il n'a pas de sens d'avoir un type de données totalement commandé qui ne prend pas en charge l'égalité. Cependant, Enum code> n'a pas besoin de eq code>. Étant donné que Enum code> ne fournit aucune garantie de commande, il ne fournit pas non plus de garanties d'égalité. P>
Il n'est pas tout à fait vrai que cela n'aurait pas de sens d'avoir ord code> sans eq code>, prenez des numéros de points flottants par exemple.
Enum représente des types pouvant être mappés vers / des entiers. Les entiers peuvent être testés pour l'égalité. Y a-t-il une instance de Enum code> qui ne veut pas eq code>?
@Tilowiklund Eh bien, si vous dites que les numéros de points flottants ne doivent pas avoir une instance code> eq code>, ils ne doivent pas avoir une instance ord code>, non plus. Ils devraient plutôt seulement avoir min code> et max code>
@ L01man: Je ne sais pas, mais si Enum code> dépend de ord code> qui impliquerait qu'il dépend de la mise en œuvre spécifique de ord code>, et pourtant Votre type de données peut vouloir trier différemment que le Enum code> -Mapped entiers le font.
@Kevinballard: Vous pouvez toujours définir votre propre instance de ord code>. Qu'en est-il de eq code> et Enum code>?
@ L01man: qu'en est-il? Pourquoi ENUM code> nécessite nécessairement EQ code>?
@Kevinballard Bon point, avait un pet de cerveau et ne pensais pas à l'antireflexivité :)
@Kevinballard: Si les choses peuvent être énumérées, elles ont leur propre place dans l'énumération, elles peuvent donc être comparées à l'égalité avec leur place comme critère ... peut-être.
@ L01MAN: Si vous le souhaitez, utilisez simplement Sortby (comparant geenum) code>.
Il y a des choses qui peuvent être énumérées sans ordre. Par exemple:
data Color = Red | Green | Blue deriving Enum
Pourquoi la commande n'est-elle pas simplement l'ordre séquentiel? Donc, comparer rouge vert code> est lt code>, correspondre bleu code> est lt code>.
Bien que je ne sois pas sûr de dans quelle mesure cette mesure est généralement acceptée, mais j'ai toujours visualisé Enum code> en tant que type de typlass décrivant des types avec des préordres totaux canoniques em> (c.-à-d. pourrait être une boucle) de sorte que la séquence de termes "entre" toute paire de termes est finie (témoin par énumfromto code>). P>
ord code>, d'autre part, décrit les types avec Canonical Total des commandes em>, sans aucune exigence que l'ensemble d'éléments entre une paire de termes soit fini. P >