Question

J'ai lu que l'inférence de type Scala est pas globale si c'est pourquoi les gens doivent placer des annotations de type sur les méthodes. (Serait-ce l'inférence de type "local"?)

Je ne peu comprendre que la raison est de nature orientée objet, mais la clarté me échappe. Y at-il une explication pour « inférence de type global » et pourquoi Scala ne peut pas avoir qu'un débutant peut comprendre?

Était-ce utile?

La solution

L'exemple typique d'une inférence de type global est Hindley-Milner : Il faut programme donné et « tous les » calcule les types nécessaires. Cependant, pour y parvenir, la langue donnée doit avoir certaines propriétés (il y a des extensions à HM, qui tentent de surmonter certaines de ces restrictions). Deux choses HM ne sont comme l'héritage et la surcharge de méthode. Pour autant que je comprends ce sont les principaux obstacles à la Scala à adopter HM ou une variante de celui-ci. Notez que, dans la pratique même des langues qui reposent en grande partie sur HM ne parviennent jamais à une déduction de 100%, par exemple même en Haskell vous avez besoin d'une annotation de type de temps à autre.

Scala utilise un plus limité (comme vous le dites « local ») sous forme d'inférence de type, ce qui est toujours mieux que rien. Pour autant que je peux dire à l'équipe Scala essaie d'améliorer l'inférence de type de version en version quand il est possible, mais jusqu'à présent, je l'ai vu étapes que plus petites. L'écart à un type style HM inferencer est encore énorme, et ne peut pas être complètement fermé.

Autres conseils

Le problème est que l'inférence de type HM est indécidable en général dans une langue sous-typage, la surcharge ou des fonctions similaires. Ref ce moyen de plus en plus de choses pourrait être ajouté à la inferencer pour le rendre plus déduire des cas particuliers, mais il y aura toujours un code où il échouera.

Scala a pris la décision de faire des annotations de type dans les arguments de méthode et d'autres lieux obligatoires. Cela peut sembler une première dispute, mais considérer que cela aide à documenter le code et fournit le compilateur des informations peut comprendre en un seul endroit. De plus, les langues avec l'inférence HM souffrent souvent du problème que des erreurs de programmation sont parfois détectés dans le code loin de l'erreur d'origine, car l'algorithme HM juste allé le long et est arrivé (par hasard) pour déduire d'autres parties du code avec le type défectueux il déduit avant qu'il a échoué.

inférence de Scala fonctionne essentiellement de l'extérieur (définition de la méthode) à l'intérieur (code à l'intérieur de la méthode) et limite donc l'impact d'une annotation de type incorrect.

Langues avec travail d'inférence HM de l'intérieur vers l'extérieur (en ignorant la possibilité d'ajouter des annotations de type) qui signifie qu'il ya une chance qu'un petit changement de code dans une méthode unique peut changer le sens du programme. Cela peut être bon ou mauvais.


Ref: Lower bounds on type inference with subtypes

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top