23 votes

Que signifie "instance" en Haskell ?

En Java, nous pouvons créer des objets/instances à partir de classes. En Haskell, nous pouvons créer des instances à partir de classes de types, par exemple :

data ShirtSize = S | M | L      -- Here ShirtSize is a enum data-type

class MyEq a where
  (==) :: a -> a -> Bool
instance MyEq ShirtSize where   -- Here ShirtSize is an instance of the MyEq type-class
  S == S = True
  M == M = True
  L == L = True
  _ == _ = False

Ce n'est pas la même question que : confusion sur la fonction en tant qu'instance du foncteur en haskell Obs : Je ne demande pas comment fmap fonctionne, je demande ce que signifie la déclinaison d'instance en Haskell.

Ma question est la suivante : Que signifie "instance" en haskell ? En java, nous pouvons créer des instances à partir de classes, mais en haskell, il semble que les instances soient des types (comme ShirtSize) sur lesquels on peut appliquer des fonctions de classe de type (par exemple la fonction (==) de MyEq). Ai-je raison ? Et aussi, qu'est-ce qu'une instance en Haskell par rapport à une instance/un objet en Java ?

31voto

n.m. Points 30344

En Java, le système de classes est un moyen de regrouper des objets similaires. Une instance d'une classe est un objet individuel qui appartient à cette classe.

En Haskell, le système de classes est (grosso modo) un moyen de regrouper des éléments similaires. types . (C'est la raison pour laquelle nous les appelons "classes de type"). Une instance d'une classe est un individu type qui appartient à cette classe. (C'est-à-dire jusqu'à ce que vous commenciez à considérer des classes de type multiparamétrique).

Soit dit en passant, une classe (monoparamétrique) Haskell ressemble quelque peu à une interface Java et, par extension, à une classe Java. Ou peut-être qu'une instance Haskell ressemble à une classe Java. Il est préférable de considérer cela comme une coïncidence. Abordez le terme en gardant à l'esprit ses origines mathématiques. Une classe est simplement un ensemble de choses qui vont ensemble, et une instance est l'une de ces choses.

11voto

Shersh Points 5567

Si vous êtes intéressé par l'explication des classes de types et la différence avec les interfaces Java, vous devriez lire le document suivant ce message par <❤> . Il explique également les instances.

Quant à moi, je regarde instance comme lien entre le type de données et l'interface . data contient des informations, class contient des méthodes. data Il s'agit de données (désolé pour la tautologie) et class Il s'agit de comportement . Lorsque vous regardez un type de données, vous ne voyez pas ce que vous pouvez en faire, mais plutôt ce qu'il stocke. Lorsque l'on regarde class vous voyez ce que le type devrait être capable de faire, vous ne vous souciez pas de ce qu'il stocke en interne. Dans la programmation réelle, vous vous souciez des détails des implémentations et de la façon dont les méthodes sont implémentées en utilisant des données spécifiques. Ainsi, instance vous montre simplement la relation entre certaines données et un certain comportement - comment ce comportement est mis en œuvre en utilisant des données données données.

Si vous souhaitez en savoir plus sur les modèles de classes de type, lisez cet article de blog : http://www.haskellforall.com/2012/05/scrap-your-type-classes.html

Vous pouvez considérer les instances comme des valeurs ! Cela pourrait vous étonner si vous êtes confronté à une telle définition pour la première fois.

Dans certains langages de type dépendant instances sont en fait des valeurs que vous pouvez passer à d'autres fonctions. Jetez un coup d'œil à cette question :

Dans Idris, "Eq a" est-il un type, et puis-je lui fournir une valeur ?

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