Frage

Ich habe gelesen, dass Scala Typinferenz nicht global so ist, deshalb Menschen Typenannotationen auf die Methoden setzen müssen. (Wäre dies "local" Typinferenz?)

ich nur ein wenig verstehen, dass der Grund, aus seiner objektorientierten Natur ist, sondern Klarheit entzieht sich mir. Gibt es eine Erklärung für die „globale Typinferenz“ und warum Scala kann es nicht haben, dass ein Anfänger verstehen könnte?

War es hilfreich?

Lösung

Das typische Beispiel für eine globale Typinferenz ist Hindley-Milner : Es dauert eine Programm und „berechnet“ alle erforderlichen Typen gegeben. Doch um dies zu erreichen, muss die jeweilige Sprache einige Eigenschaften haben (es gibt Erweiterungen HM, die versuchen, einige dieser Einschränkungen zu überwinden). Zwei Dinge HM nicht wie sind Vererbung und Verfahren Überlastung. Soweit ich verstehe, das sind die wichtigsten Hindernisse für Scala zu verabschieden HM oder eine Variante davon. Beachten Sie, dass in der Praxis auch Sprachen, die sich stark auf HM verlassen nie eine 100% Inferenz erreichen, z.B. auch in Haskell müssen Sie eine Typanmerkung von Zeit zu Zeit.

So Scala nutzt eine begrenztere (wie Sie „local“ sagen) Form Typinferenz, die als nichts noch besser ist. Soweit ich das Scala-Team sagen kann, versucht, die Typinferenz von Release zu verbessern freizugeben, wenn es möglich ist, aber bisher habe ich nur kleinere Schritte gesehen. Der Spalt auf einen Typ HM Rückschließer Stil ist immer noch riesig, und kann nicht vollständig geschlossen werden.

Andere Tipps

Das Problem ist, dass HM Typinferenz in einer Sprache im Allgemeinen unentscheidbar ist mit Subtypisierung, Überlastung oder ähnlichen Merkmalen. Ref das bedeutet mehr und mehr Material zu dem Rückschließer hinzugefügt werden könnte, um es Sonderfälle zu machen schließen, aber es wird immer Code, wo es fehlschlagen wird.

Scala hat die Entscheidung getroffen, für die zwingende Typenannotationen in Methodenargumente und einigen anderen Orten zu machen. Dies könnte wie ein Streit scheint zuerst, aber bedenken Sie, dass dies den Code zu dokumentieren hilft und stellt den Compiler mit Informationen, die sie an einem Ort verstehen. Zusätzlich Sprachen mit HM Inferenz oft unter dem Problem leiden, dass Programmierfehler manchmal in Code erkannt werden weit entfernt vom ursprünglichen Fehler, denn der HM-Algorithmus nur entlang ging und zufällig (zufällig) andere Teile des Codes mit der fehlerhaften Art zu folgern gefolgert, bevor es versagt.

Scala Inferenz funktioniert im Prinzip von außen (Methodendefinition) nach innen (Code innerhalb der Methode) und begrenzt somit die Auswirkungen einer falschen Anmerkung.

Sprachen mit HM Inferenz Arbeit von innen nach außen (ohne Berücksichtigung die Möglichkeit Typenannotationen hinzufügen), das bedeutet, dass es eine Chance, dass eine kleine Codeänderung in einem einzigen Verfahren kann die Bedeutung des gesamten Programms ändern. Das kann gut oder schlecht sein.


Ref: Lower bounds on type inference with subtypes

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top