43 votes

Que signifie le symbole => en Haskell ?

Je suis novice en Haskell et, en général, en programmation fonctionnelle, et je suis un peu mal à l'aise avec sa syntaxe.

Dans le code suivant, que fait l'élément => dénote ? Et aussi (Num a, Ord a) ?

loop :: (Num a, Ord a) => a -> (t -> t) -> t -> t

56voto

ehird Points 30215

Il s'agit d'une contrainte de classe de type ; (Num a, Ord a) => ... signifie que loop fonctionne avec n'importe quel type a qui est une instance de la Num y Ord correspondant respectivement aux types numériques et aux types ordonnés. Fondamentalement, vous pouvez penser à loop comme ayant le type sur le côté droit de l'écran. => sauf que a doit être une instance de Num y Ord .

On peut considérer que les classes de types sont fondamentalement similaires aux interfaces OOP (mais ce n'est pas la même chose !) - elles encapsulent un ensemble de définitions que toute instance doit prendre en charge, et du code générique peut être écrit à l'aide de ces définitions. Par exemple, le code générique peut être écrit en utilisant ces définitions, Num comprend des opérations numériques telles que l'addition et la multiplication, tandis que Ord comprend moins que, plus que, etc.

Pour plus d'informations sur les classes de types, voir cette introduction de Apprenez un Haskell .

21voto

Owen Points 14439

=> sépare les deux parties d'une signature de type :

  • A gauche, les contraintes de classe de type
  • A droite, le type actuel

Vous pouvez donc penser à (Num a, Ord a) => a -> (t -> t) -> t -> t comme signifiant "le type est a -> (t -> t) -> t -> t et il doit également y avoir un Num instance pour a et un Ord instance pour a ".

Pour en savoir plus sur les classes de types, voir http://www.learnyouahaskell.com/types-and-typeclasses

5voto

Dan Burton Points 26639

Une façon de voir les choses est la suivante Ord a y Num a sont des entrées supplémentaires pour la fonction. Il s'agit toutefois d'un type d'entrée particulier : dictionnaires . Lorsque vous utilisez cette fonction avec un type particulier de a , il doit également y avoir dictionnaires disponible pour le Ord y Num les opérations sur le type a également.

Toute fonction qui utilise une fonction avec des entrées de dictionnaire doit également avoir les mêmes entrées de dictionnaire.

foo :: (Num a, Ord a) => a -> t
foo x = loop x someFunc someT

Toutefois, il n'est pas nécessaire de transmettre explicitement ces dictionnaires. Haskell s'en chargera pour vous, à condition qu'un dictionnaire soit disponible. Vous pouvez créer un dictionnaire à l'aide d'une méthode typeclasse instance .

instance Num MyType with
  x + y = ...
  x - y = ...
  ...

Cela crée un dictionnaire pour le Num les opérations sur MyType Par conséquent MyType peut être utilisé partout où Num a est une entrée obligatoire (à condition qu'elle satisfasse aux autres exigences, bien entendu).

3voto

Peter Hall Points 2991

Sur le côté gauche de l'écran => vous déclarez des contraintes pour les types utilisés à droite.

Dans l'exemple que vous donnez, cela signifie que a est contraint d'être une instance à la fois de la classe Ord et la classe de type Num classe de type.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X