Frage

Wie Scala Typ-System zu einem Haskell Experten erklären? Welche Beispiele zeigen Scala Vorteile?

Wie Haskells Typ-System zu einem fortgeschrittenen Scala Praktiker erklären? Was kann in Haskell getan werden, die nicht in Scala kann getan werden?

War es hilfreich?

Lösung

Scala Zu einem Haskell-Programmierer:

Scala ist eine strenge und unreine Sprache mit First-Class-Module. Datentypen werden als „Klassen“ oder „Traits“ mit subtilen Unterschieden erklärt und Module oder „Objekte“ sind Werte dieser Typen. Scala unterstützt allquantifizierte Typ unter Parameter Typkonstruktoren. Objekte / Klassen / Merkmale haben Mitglieder, die von Werten, wandelbar Variablen bestehen und Funktionen (so genannten „Methoden“, zu dem das Modul wird implizit als eine Variable namens this bestanden). Die Module können Typ-Mitglieder haben, die auch Parameter übernehmen können. Typ-Mitglieder sind existentiell quantifizieren und Typ-Parameter können mit höheren kinded sein. Da Typen können Mitglieder von First-Class-Wert sein, bietet Scala einen Geschmack von abhängiger Typisierung genannt pfadabhängige Typen .

Erste-Klasse-Funktionen sind auch Module. Eine Funktion ist ein Modul mit einer Methode namens apply. Ein Verfahren ist nicht erste Klasse, sondern eine Syntax wird ein Verfahren in einer First-Class-Funktion zu wickeln. Leider erfordert ein Modul alle seine Typparameter vorne, damit eine teilweise erstklassige angewandte Funktion erlaubt ist nicht allgemein quantifiziert werden. Allgemeiner gesagt, vollständig Scala für Typen von Rang höher als 1 einen direkten Mechanismus fehlt, sondern Module auf höheren kinded Typen parametrisiert können rank-n-Typen zu simulieren genutzt werden.

Statt Typklassen mit globaler Reichweite, Scala können Sie einen impliziten Wert eines bestimmten Typs deklarieren. Dazu gehören Typen Funktion, die implizite Umwandlung bereitstellt, und daher Typ-Erweiterung. Neben impliziten Konvertierungen, wird Typ-Erweiterung durch die „extends“ Mechanismus versehen, der Sie einen Subtyp / geordneter Typ Beziehung zwischen den Modulen erklären lässt. Dieser Mechanismus kann verwendet werden, algebraische Datentypen zu simulieren, wo der Supertyp als Typ auf der linken Seite einer Datendeklaration zu sehen ist, und dessen Subtypen, wie die Konstrukteure Wert auf der rechten Seite. Scala verfügt über umfangreiche Pattern-Matching-Fähigkeiten eine virtualisierte Musteranpasser mit erstklassigen Mustern.

Scala unterstützt Subtyping, und dies begrenzt Typinferenz erheblich. Aber Typinferenz hat sich im Laufe der Zeit verbessert. Inference höherer kinded Typen unterstützt. Allerdings fehlt Scala eine sinnvolle Art System, und hat daher keine Art Inferenz und keinerlei Vereinigung. Wenn eine Variable vom Typ eingeführt wird, ist es von Art * sofern nicht anders kommentiert. Bestimmte Typen wie Any (der Supertyp aller Art) und Nothing (ein Subtyp aller Art) sind technisch von jede Art , obwohl sie nicht angewandt werden können Argumente zu geben.

Haskell zu einem Scala-Programmierer:

Haskell ist eine rein funktionale Sprache. Dies bedeutet, dass Funktionen sind keine Nebenwirkungen überhaupt zu haben, erlaubt. Zum Beispiel ist ein Haskell-Programm nicht auf den Bildschirm als solche drucken, sondern ist eine Funktion, die einen Wert des IO[_] Datentypen zurückgibt, die eine Folge von Aktionen für das IO-Subsystem beschreibt auszuführen.

Während Scala standardmäßig streng und bietet „by-name“ Anmerkung für nicht strikte Funktionsargumente, Haskell ist faul standardmäßig mit „by-need“ Semantik und bietet Anmerkung für strenge Argumente.

Typ-Inferenz in Haskell ist vollständiger als in Scala, volle Inferenz mit. Dies bedeutet, dass Typenannotation fast nie notwendig ist.

Neue Erweiterungen des GHC Compiler erweiterte Typ-System-Funktionen ermöglichen, die keine Entsprechung in Scala haben, wie Rang-n-Typen, Typ Familien und Arten Polymorphismus.

In Haskell, ist ein Modul, eine Sammlung von Typen und Funktionen, aber Module sind nicht erstklassige Einrichtungen. Implicits werden von Typklassen zur Verfügung gestellt, aber diese global scoped einmal erklärt, und sie können nicht explizit als in Scala übergeben werden. Multiple Instanzen einer Typklasse für einen bestimmten Typen gelöst werden, indem sie mit einem newtype Verpackung eindeutig zu machen, während in Scala dies einfach gelöst wird, würde durch Scoping oder durch Instanzen explizit übergeben.

Da Haskell nicht „objektorientiert“, gibt es keine Methode / Funktion Dichotomie. Jede Funktion ist erstklassig und jede Funktion ist standardmäßig (kein Function1, Function2 usw.) curried.

Haskell hat keinen Subtyp Mechanismus, aber Typklassen können eine Unterklasse Beziehung haben.

Andere Tipps

Ich glaube nicht, dass jemand hat Haskell systematisch verglichen mit Scalas (wie durch GHC des Typ-System veranschaulicht). Die wichtigsten Punkte Unterschied sind der Grad der Typinferenz und Unterstützung für höherrangige Typen. Aber eine vollständige Behandlung der Unterschiede wäre ein veröffentlichbare Ergebnis sein.

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