5

Je ne peux pas vraiment l'obtenir. Pourquoi avons-nous besoin du tout? Je veux dire que si j'utilise le même paramètre de type, je pense que cela signifie qu'ils devraient être du même type. J'ai entendu dire que cela peut aider le compilateur à éviter la boucle infinie. Quelqu'un peut-il me dire plus de détails à ce sujet? En fin de compte, y a-t-il des «modèles et pratiques» à suivre sur l'utilisation de la dépendance fonctionnelle dans Real World Haskell?Dépendance fonctionnelle dans Haskell

[Suivi Question]

class Extract container element where 
    extract :: container -> element 

instance Extract (a,b) a where 
    extract (x,_) = x 

Dans le code ci-dessus, j'ai utilisé la même variable de type « a » pour les deux récipient et l'élément, je pense que le compilateur peut donc en déduire que ces deux types sont du même type.

Mais quand j'ai essayé ce code dans GHCi, j'ai obtenu les commentaires suivants:

*Main> extract('x',3) 
<interactive>:1:0: 
    No instance for (Extract (Char, t) element) 
     arising from a use of `extract' at <interactive>:1:0-13 
    Possible fix: 
     add an instance declaration for (Extract (Char, t) element) 
    In the expression: extract ('x', 3) 
    In the definition of `it': it = extract ('x', 3) 

Lorsque l'un d'entre eux a été spécifié comme type « char », pourquoi l'autre est encore de type non résolues « élément '?

+5

est-ce que http://www.haskell.org/haskellwiki/Functional_dependencies aide? – lijie

Répondre

6

Je pensais cela plutôt à explains. Donc, fondamentalement, si vous avez une relation FD d'un -> b tout cela signifie pour la classe de type instance il ne peut y avoir qu'un 'b' avec un 'a' donc Int Int mais vous ne pouvez pas avoir Int Float aussi . C'est ce qu'ils veulent dire quand on dit que 'b' est uniquement déterminé à partir de 'a'. Cela s'étend à n'importe quel nombre de paramètres de type. La raison pour laquelle il est nécessaire est 1. Tenter d'inférence 2. Parfois, vous voulez une contrainte comme ça.

Une alternative aux FD est l'extension des familles de types mais pas pour tous les cas de FD.

+0

Merci pour vos commentaires. Cet article est génial. Maintenant, je sais exactement quelle est ma vraie question. Vous avez dit 'parfois vous voulez une contrainte comme ça'. Je comprends cette partie. Mais je ne comprends pas pourquoi cela est nécessaire pour l'inférence de type. J'ai mis à jour ma question avec une autre question de suivi. L'exemple provient de cette page wiki que vous avez mentionnée ci-dessus. – aXqd

+0

J'ai finalement compris. Le compilateur essaie toujours de trouver la bonne instance de typeclass, donc il n'a rien à voir avec cette instance spécifique. Je ne donne pas le type de retour, d'où il est ambigu. – aXqd

+0

Si j'ajoute une dépendance fonctionnelle, le compilateur peut être sûr que tant que le type de conteneur peut trouver une correspondance, le compilateur peut utiliser cette instance, car il ne peut avoir qu'une seule sorte de type de retour maintenant. – aXqd