Frage

Ich habe gelesen, dass Scala Typsystem von Java Interoperabilität geschwächt und kann daher nicht zum Teil der gleichen Befugnisse wie Haskell Typ-System auszuführen. Ist das wahr? Ist die Schwäche wegen der Typ Löschung, oder ich bin falsch in jeder Hinsicht? Ist dieser Unterschied der Grund, dass Scala keine typeclasses hat?

War es hilfreich?

Lösung

Der große Unterschied ist, dass Scala nicht Hindley-Milner globalen Typinferenz haben und verwendet stattdessen eine Form der lokalen Typinferenz, die Sie auffordert, Typen für Methodenparameter zu spezifizieren und den Rückgabetyp für überlastet oder rekursive Funktionen.

Dies ist nicht durch Typen Löschung oder durch andere Anforderungen der JVM angetrieben. Alle möglichen Schwierigkeiten hier überwunden werden können, und haben nur Jaskell betrachten - http: //docs.codehaus .org / Anzeige / Jaskell / Startseite

H-M-Inferenz funktioniert nicht in einem objektorientierten Kontext. Insbesondere dann, wenn Typ-Polymorphismus verwendet wird (im Gegensatz zu dem Ad-hoc-Polymorphismus von Typklassen gegen). Dies ist entscheidend für starke Interop mit anderen Java-Bibliotheken und (in geringerem Maße) die bestmögliche Optimierung der JVM zu erhalten.

Es ist nicht wirklich gültig zu erklären, dass entweder Haskell oder Scala ein stärkeres Typ-System, nur, dass sie anders sind. Beide Sprachen sind die Grenzen für Typ-basierte Programmierung in verschiedene Richtungen schieben und jede Sprache hat einzigartige Stärken, die schwer in die andere zu kopieren.

Andere Tipps

Scala Typ-System unterscheidet sich von Haskell, obwohl Scala Konzepte manchmal direkt inspiriert von Haskell Stärken und seine kenntnisreiche Gemeinschaft von Forschern und Fachleuten.

Natürlich auf einer VM läuft nicht in erster Linie für die funktionale Programmierung in erster Linie schafft einige Kompatibilitätsprobleme mit vorhandenen Sprachen diese Plattform Targeting. Da die meisten der Argumentation über Typen bei der Kompilierung der Fall ist, die Grenzen der Java (als Sprache und als Plattform) zur Laufzeit sind nichts besorgt zu sein (außer Typ Erasure, obwohl scheint genau dieser Fehler die Integration in die Java zu machen Ökosystem mehr nahtlos).

Soweit ich der einzige „Kompromiss“ auf dem Typensystemebene mit Java kennen, ist eine spezielle Syntax Raw Arten zu behandeln. Während Scala nicht einmal mehr Raw-Typen ermöglicht, akzeptiert sie ältere Java-Klassendateien mit dem Fehler. Sie sehen Code wie List[_] haben (oder mehr gleichwertig List[T] forSome { type T }) Vielleicht. Dies ist eine Kompatibilität Funktion mit Java, wird aber als existentielle Art intern zu behandeln und schwächt nicht den Typ System.

Scala Typ System unterstützt Typklassen , obwohl in einem ausführliche Art und Weise als Haskell. Ich schlage vor, dieses Papier zu lesen, die einen anderen Eindruck von der relativen Stärke des Scala Typ-Systems erstellen könnten (die Tabelle auf Seite 17 dienen als eine nette Liste von sehr leistungsfähigen Typ Systemkonzepten).

Zusammenhang nicht notwendigerweise auf die Leistung des Typsystems ist der Ansatz, Scala und Compiler Haskell verwenden Typen ableiten, obwohl es einige Auswirkungen auf die Art, wie Menschen Code zu schreiben hat. einen leistungsfähigen Typ Inferenzalgorithmus zu haben, kann es sich lohnen machen abstraktere Code zu schreiben (Sie können selbst entscheiden, ob das eine gute Sache ist in allen Fällen).

Am Ende Scala und Haskell Typ-System werden von dem Wunsch getrieben, ihre Nutzer mit den besten Tool zu bieten, um ihre Probleme zu lösen, haben aber unterschiedliche Wege zu diesem Ziel gemacht.

ein weiterer interessanter Punkt ist, dass Scala unterstützt direkt den klassischen OO-Stil. Welche Mittel gibt es Subtyp Beziehungen (zum Beispiel Liste ist eine Unterklasse von Seq). Und das macht Typinferenz komplizierter. Hinzu kommt die Tatsache, dass Sie in Züge in Scala mischen, was bedeutet, dass ein bestimmter Typ mehrere Supertyp Beziehungen haben kann (so dass es noch komplizierter)

Scala hat keine Rang-n-Typen , obwohl es möglich sein kann, < a href = "http://apocalisp.wordpress.com/2010/07/02/higher-rank-polymorphism-in-scala/" rel = "noreferrer"> Arbeit um diese Einschränkung in bestimmten Fällen.

Ich habe nur wenig experenice mit Haskell, aber die naheliegendste Sache, die ich zur Kenntnis, dass Scala Typ-System unterscheidet sich von Haskell ist die Typinferenz.

In Scala gibt es keine globale Typinferenz, müssen Sie die Art der Funktionsargumente explizit sagen.

Zum Beispiel in Scala benötigen Sie diese schreiben:

def add (x: Int, y: Int) = x + y

statt

add x y = x + y

Dies kann Probleme verursachen, wenn Sie generische Version von Add-Funktion benötigen, dass die Arbeit mit allen Arten von Typ die „+“ Methode hat. Es gibt eine Abhilfe für dieses, aber es wird ausführlicher erhalten.

Aber im wirklichen Gebrauch, fand ich Scala Typ-System ist leistungsfähig genug für die täglichen Gebrauch, und ich fast nie diese Abhilfe für allgemeine Verwendung, vielleicht ist dies, weil ich aus Java-Welt kommen.

Und die Begrenzung der expliziten declare die Art der Argumente nicht notwendig ist, eine schlechte Sache, müssen Sie es trotzdem dokumentieren.

Nun sind Turing sie reduzierbar?

Siehe Oleg Kiselyov Seite http://okmij.org/ftp/ ... Man kann das Lambda-Kalkül in Haskell Typ-System implementieren. Wenn Scala das tun kann, dann in einem gewissen Sinne Haskells Typsystem und Scala Typ-System die gleichen Arten berechnen. Die Fragen sind: Wie natürlich ist man über die andere? Wie elegant ist eine über den anderen?

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