Nachteile von Scala-Typsystem vs. Haskell?
Habe ich gelesen, dass Scala ' s Typsystem ist geschwächt durch Java-Interoperabilität und kann daher nicht ausführen einige der die gleichen Befugnisse wie Haskell Typ-system. Ist das wahr? Ist die Schwäche, denn der Typ Löschung, oder bin ich da falsch in jeder Hinsicht? Ist dieser Unterschied der Grund dafür, dass Scala keine typeclasses?
- Möchten Sie vielleicht, um diese zu Lesen. lambda-the-ultimate.org/taxonomy/term/32
- Ich bin mir ziemlich sicher, dass Haskell hat mindestens so viel type-erasure als Scala tut, für was das Wert ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der große Unterschied ist, dass Scala nicht Hindley-Milner Globale Typ-Inferenz und verwendet stattdessen eine form von lokaler Typrückschluss, dass Sie zur Angabe von Typen für die Parameter der Methode und der return-Typ für überlastet oder rekursiven Funktionen.
Dies ist nicht getrieben von type erasure oder durch andere Anforderungen der JVM. Alle möglichen hier Schwierigkeiten überwunden werden können, und gewesen sind, nur berücksichtigen, Jaskell - http://docs.codehaus.org/display/JASKELL/Home
H-M-Inferenz funktioniert nicht in einer Objekt-orientierten Kontext. Insbesondere beim Typ-Polymorphie verwendet wird (im Gegensatz zu den ad-hoc-Polymorphismus Typ-Klassen). Dies ist entscheidend für eine starke interop mit anderen Java-Bibliotheken und (in geringerem Maße), um die bestmögliche Optimierung der JVM.
Es ist nicht wirklich zulässig, zu behaupten, dass entweder in Haskell oder Scala hat eine stärkere Typ-system, nur, dass Sie anders sind. Beide Sprachen sind die Grenzen für Typ-basiertes Programmieren in verschiedene Richtungen, und jede Sprache hat einzigartige stärken, die schwer zu duplizieren in der anderen.
Scala ' s Typsystem unterscheidet sich von Haskell ist, obwohl Scala die Konzepte sind manchmal direkt inspiriert von Haskell zu stärken und seine kompetenten community von Forschern und Fachleuten.
Natürlich, es läuft auf einer VM nicht in Erster Linie vorgesehen für die funktionale Programmierung in den ersten Platz schafft einige Kompatibilitätsprobleme mit bestehenden Sprachen Ausrichtung dieser Plattform.
Weil die meisten die Argumentation über Typen geschieht bei der Kompilierung, die Einschränkungen von Java (als Sprache und als Plattform) bei runtime sind nichts zu befürchten (mit Ausnahme von Type Erasure, obwohl genau dieser Fehler scheint die integration in das Java-ökosystem mehr nahtlos).
Soweit ich weiß der einzige "Kompromiss", auf den Typ system-Ebene mit Java eine spezielle syntax zu behandeln Raw-Typen. Während Scala gar nicht erlauben Rohen Typen mehr, Sie nimmt es mit älteren Java-Klasse-Dateien mit diesem Fehler.
Haben Sie vielleicht gesehen-code wie
List[_]
(oder mehr entsprichtList[T] forSome { type T }
). Dies ist ein Kompatibilitäts-feature mit Java, aber behandelt wird als eine existentielle Typ intern auch, und nicht zu einer Schwächung der Typ system.Scala ' s Typsystem unterstützt Typ-Klassen, obwohl in einer ausführlicheren Weise als Haskell. Ich schlage vor, diesen Aufsatz zu Lesen, die vielleicht einen anderen Eindruck auf die relative Stärke von Scala ' s Typsystem (die Tabelle auf Seite 17 dient als eine nette Liste von sehr mächtiges Typ-system-Konzepte).
Nicht notwendigerweise mit der macht der Typ-system ist der Ansatz, Scala und Haskell-Compiler verwenden, um zu folgern Arten, obwohl es hat einige Auswirkungen auf die Art, wie Menschen schreiben code.
Mit einer leistungsstarken Typ-Inferenz-Algorithmus kann es sich lohnen, mehr zu schreiben, abstrakten code (Sie können selbst entscheiden, ob das ist eine gute Sache in allen Fällen).
Ende Scala und Haskell Typ-system sind getrieben von dem Wunsch, bieten Ihren Nutzern die besten tools, um Ihre Probleme zu lösen, aber genommen haben, unterschiedliche Wege zu diesem Ziel.
ein weiterer interessanter Punkt zu beachten ist, dass Scala unterstützt direkt die klassischen OO-Stil. Das heißt, es gibt Subtyp Beziehungen (z.B. Liste ist eine Unterklasse von Seq). Und das macht die Typ-Inferenz komplizierter. Hinzu kommt die Tatsache, dass Sie können mix in traits in Scala, was bedeutet, dass ein Typ mehrere Supertypen Beziehungen (das macht es noch komplizierter)
Scala nicht Rang-n-Arten, obwohl es möglich sein kann, zu um dieses Problem zu umgehen in bestimmten Fällen.
Ich habe nur wenig experenice mit Haskell, aber die offensichtlichste Sache, die ich beachten Sie, dass das Scala-Typsystem unterscheidet sich von Haskell ist der Typ-Inferenz.
In Scala gibt es keine globalen Typ-Inferenz, müssen Sie explizit sagen, der Typ der Funktionsargumente.
Beispielsweise in Scala müssen Sie dies schreiben:
statt
Kann dies zu Problemen führen, wenn Sie brauchen, um eine generische version des add-Funktion, die das arbeiten mit allen Arten von Typ, hat die " + " - Methode. Es gibt ein workaround dafür, aber es kommt noch Ausführlicher.
Aber im realen Einsatz, ich fand Scala ' s Typsystem ist stark genug für den täglichen Gebrauch, und ich fast nie verwenden Sie diese Problemumgehung für generische, vielleicht deshalb, weil ich komme aus der Java-Welt.
Und die Beschränkung der explizite deklarieren der Typ der Argumente ist nicht notwendig, eine schlechte Sache, die Sie benötigen, Dokument es trotzdem.
Gut sind Sie Turing-reduzierbar?
Siehe Oleg Kiselyov Seite http://okmij.org/ftp/
...
Man kann Umsetzung des lambda-Kalkül in Haskell Typ-system. Wenn Scala machen kann, dann in einen Einblick in Haskell Typ-system und Scala ' s Typsystem berechnen den gleichen Typen. Die Fragen sind: Wie natürlich ist, einen über den anderen? Wie elegant ist eine über das andere?