10
votes

Sont Ord et Enum parfois incompatibles à Haskell?

pourrait ORD et ENUM Soyez un typclass? Pourquoi ne Enum nécessite-t-il eq ?


0 commentaires

3 Réponses :


9
votes

Enum 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.

ord 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.

comme pour eq , ord 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 n'a pas besoin de eq . Étant donné que Enum ne fournit aucune garantie de commande, il ne fournit pas non plus de garanties d'égalité.


9 commentaires

Il n'est pas tout à fait vrai que cela n'aurait pas de sens d'avoir ord sans eq , 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 qui ne veut pas eq ?


@Tilowiklund Eh bien, si vous dites que les numéros de points flottants ne doivent pas avoir une instance eq , ils ne doivent pas avoir une instance ord , non plus. Ils devraient plutôt seulement avoir min et max SEMRUMOUP instances.


@ L01man: Je ne sais pas, mais si Enum dépend de ord qui impliquerait qu'il dépend de la mise en œuvre spécifique de ord , et pourtant Votre type de données peut vouloir trier différemment que le Enum -Mapped entiers le font.


@Kevinballard: Vous pouvez toujours définir votre propre instance de ord . Qu'en est-il de eq et Enum ?


@ L01man: qu'en est-il? Pourquoi ENUM nécessite nécessairement EQ ?


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



11
votes

Il y a des choses qui peuvent être énumérées sans ordre. Par exemple:

data Color = Red | Green | Blue deriving Enum


1 commentaires

Pourquoi la commande n'est-elle pas simplement l'ordre séquentiel? Donc, comparer rouge vert est lt , correspondre bleu est lt .



2
votes

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 en tant que type de typlass décrivant des types avec des préordres totaux canoniques (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 ).

ord , d'autre part, décrit les types avec Canonical Total des commandes , sans aucune exigence que l'ensemble d'éléments entre une paire de termes soit fini.


0 commentaires