types de signature de type pour les listes, etc.
-
28-10-2019 - |
Question
Comment définiriez-vous les signatures de type suivantes en anglais simple:
Ord a => ...
Eq a => ...
Num a => ...
Pouvez-vous décrire la signification de ces derniers et me faire savoir quelles sont les différences (en termes de la façon dont je l'expliquer à quelqu'un d'autre)?
Merci.
La solution
Ce sont tous des exemples de « contraintes de classe »: ils contraignent quels types peuvent être utilisés à la place de la variable de type qui les suit (a
dans ce cas), exigeant qu'il appartient à un particulier Type classe. Ord
, Eq
et Num
sont des exemples de classes de type.
-
moyen de
Ord a => ...
a
est un type qui a une notion naturelle de commande qui lui est associé. Par exemple, les entiers peuvent être naturellement disposés de petit au plus grand. En termes mathématiques, il existe ordre total d'un sura
. Un exemple évident d'une fonction qui nécessite cette contrainte estsort :: Ord a => [a] -> [a]
; lire cette signature en disant quesort
ne fonctionne que sur des listes de choses qui peuvent être mises en ordre par rapport à l'autre. -
moyen
a
est un type dont les membres peuvent être comparés les uns aux autres pour une certaine notion d'égalité. En termes mathématiques, il existe une équivalence relation sura
. Notez que ceci est une superclasse deOrd
, ce qui signifie tout ce qui a une notion de commande doit aussi avoir une notion d'équivalence. Un exemple d'une fonction qui exige cette contrainte estelem :: Eq a => a -> [a] -> Bool
(qui détermine si une liste contient un élément donné); lire cette signature en disant queelem
ne fonctionne que sur des listes de choses qui peuvent être comparés les uns aux autres pour l'égalité. Si vous pensez à la façon dont vous écririezelem
vous, cela devrait donner un sens. -
moyens de
Num a => ...
a
est un type numérique, ce qui signifie qu'il prend en charge certaines opérations arithmétiques de base:+
,*
,-
,abs
. Je crois que c'est à peu près semblable à la notion mathématique d'un anneau . Fondamentalement, tous les types que vous pensez comme « types de numéro » appartiennent à cette classe:Int
,Double
, etc. Vous devriez voir la contrainteNum a =>
devant une signature si la fonction a été écrit pour le travail génériquement avec tout type de numéro. Par exemple,sum :: Num a => [a] -> a
, qui résume tous les éléments d'une liste de nombres, peut travailler aussi bien sur[Int]
,[Double]
,[Rational]
, etc ... tout ce qu'il a à faire est d'ajouter jusqu'à son contenu, peu importe quel genre de chiffres, ils sont . Mais les chiffres, ils doivent être!
Eq a => ...
Fondamentalement, ces classes de type / contraintes sont une approche à la « surcharge de principe » des fonctions. Nous pouvons utiliser (==) :: Eq a => a -> a -> Bool
sur différents types, mais non seulement tous les types . Certaines choses, par exemple des fonctions, ne font pas de sens de comparer l'égalité (peut-être parce que l'égalité n'est pas décidable pour ce type), et jamais est logique de comparer deux choses de différents types pour l'égalité (contraste avec Java, où vous pouvez comparer deux objets de types différents peut-être pour l'égalité).
Pour plus (très accessible) la lecture sur les classes de type et les contraintes, je vous recommande vivement En savoir vous Haskell .