Mir ist klar, dass einige Dinge in einer Sprache einfacher / schwieriger sind als in der anderen, aber ich interessiere mich nur für typbezogene Funktionen, die in der einen möglich und in der anderen unmöglich / irrelevant sind. Um es genauer zu machen, lassen Sie uns die Haskell-Typ-Erweiterungen ignorieren, da es so viele gibt, die alle möglichen verrückten / coolen Sachen machen.
java
haskell
type-systems
static-typing
GlenPeterson
quelle
quelle
Antworten:
("Java", wie hier verwendet, ist als Standard Java SE 7 definiert . "Haskell", wie hier verwendet, ist als Standard Haskell 2010 definiert .)
Dinge, die Javas Typsystem hat, aber Haskells nicht:
Dinge, die das Typensystem von Haskell hat, aber das von Java nicht:
BEARBEITEN:
Beispiele für jeden der oben aufgeführten Punkte:
Einzigartig für Java (im Vergleich zu Haskell)
Nomineller Subtyp Polymorphismus
Informationen zum Typ der Teillaufzeit
Einzigartig für Haskell (im Vergleich zu Java)
Eingeschränkter Ad-hoc-Polymorphismus
Polymorphismus des Subtyps "Constraint-based" (basierend auf begrenztem Ad-hoc-Polymorphismus)
Höherwertiger parametrischer Polymorphismus
Haupttypisierung
Es ist schwierig, ein direktes Beispiel dafür zu geben, aber es bedeutet, dass jeder Ausdruck genau einen maximal allgemeinen Typ (seinen Haupttyp genannt ) hat, der als kanonischer Typ dieses Ausdrucks betrachtet wird. In Bezug auf den Polymorphismus des Subtyps "Constraint-based" (siehe oben) ist der Haupttyp eines Ausdrucks der eindeutige Subtyp jedes möglichen Typs, als den dieser Ausdruck verwendet werden kann. Das Vorhandensein von Principal Typing in (nicht erweitertem) Haskell ermöglicht eine vollständige Typinferenz (dh eine erfolgreiche Typinferenz für jeden Ausdruck, ohne dass Typanmerkungen erforderlich sind). Erweiterungen, die die Haupttypisierung unterbrechen (von denen es viele gibt), unterbrechen auch die Vollständigkeit der Typinferenz.
quelle
l
als einzelne Buchstabenvariable verwenden, es ist SEHR schwer zu unterscheiden1
!Typeable
, aber Haskell 2010 hat es nicht (vielleicht wird es Haskell 2014?).Javas Typensystem weist keinen höherwertigen Polymorphismus auf. Haskells Typensystem hat es.
Mit anderen Worten: In Java können Typkonstruktoren über Typen abstrahieren, nicht jedoch über Typkonstruktoren, wohingegen in Haskell Typkonstruktoren über Typkonstruktoren und Typen abstrahieren können.
Auf Englisch: In Java kann ein generischer Typ keinen anderen generischen Typ aufnehmen und parametrisieren.
In Haskell ist das ganz einfach
quelle
<T<_> extends Collection> T<Integer> convertStringsToInts(T<string> strings)
. Die Idee hier wäre, dass wenn jemand es so nennt, dassconvertStringsToInts<ArrayList>
es eine Arrayliste von Strings nimmt und eine Arrayliste von ganzen Zahlen zurückgibt. Und wenn sie stattdessen verwendet werdenconvertStringsToInts<LinkedList>
, ist dies auch bei verknüpften Listen der Fall.forall
in seine Typen setzen kann. In Haskell ist ein Typa -> b
implizitforall a. forall b. a -> b
. Mit einer Erweiterung können Sie dieseforall
explizit machen und verschieben.Ergänzend zu den anderen Antworten verfügt das Typensystem von Haskell über keine Untertypisierung , während objektorientierte Sprachen wie Java eingegeben werden.
quelle
Eine Sache, die bisher niemand erwähnt hat, ist die Typinferenz: Ein Haskell-Compiler kann normalerweise auf die Art der Ausdrücke schließen, aber Sie müssen dem Java-Compiler Ihre Typen im Detail mitteilen. Streng genommen ist dies ein Merkmal des Compilers, aber das Design des Sprach- und Typsystems bestimmt, ob eine Typinferenz möglich ist. Insbesondere interagiert die Typinferenz schlecht mit Javas Subtyp-Polymorphismus und Ad-hoc-Überladung. Im Gegensatz dazu bemühen sich die Designer von Haskell, keine Features einzuführen, die sich auf die Typinferenz auswirken.
Eine andere Sache, die die Leute bisher noch nicht erwähnt haben, sind algebraische Datentypen. Das heißt, die Fähigkeit, Typen aus Summen ('oder') und Produkten ('und') anderer Typen zu konstruieren. Java-Klassen eignen sich gut für Produkte (Feld a und Feld b). Aber sie rechnen nicht wirklich (zB Feld a ODER Feld b). Scala muss dies als mehrere Fallklassen kodieren, was nicht ganz dasselbe ist. Und während es für Scala funktioniert, ist es ein bisschen schwierig zu sagen, dass Java es hat.
Haskell kann auch Funktionstypen mit dem Funktionskonstruktor -> erstellen. Während Javas Methoden Typensignaturen haben, können Sie diese nicht kombinieren.
Das Typensystem von Java ermöglicht eine Art Modularität , die Haskell nicht hat. Es wird eine Weile dauern, bis es ein OSGi für Haskell gibt.
quelle