Haskell-Terminologie: Bedeutung von Typ vs. Datentyp, sind sie Synonyme?

8

Ich lese das Buch: Haskell School of Expression und auf Seite 56, zu Beginn von Kapitel 5, lese ich die Begriffe "polymorphe Datentypen" und "polymorphe Typen".

Beziehen sich diese beiden Begriffe auf dasselbe Konzept?

Sind sie Synonyme?

Oder gibt es einen Unterschied zwischen den beiden? Wenn ja, was?

    
jhegedus 18.07.2014, 13:50
quelle

3 Antworten

21

Ein type (in Haskell) ist eine Syntax, die sinnvollerweise mit :: in Verbindung gebracht werden kann, um einen Ausdruck links von :: zu klassifizieren. Jede syntaktische Komponente eines Typs wird selbst durch eine Art klassifiziert, wobei die Art der Typen (die Ausdrücke klassifizieren) * ist. Einige Leute verwenden das Wort "type" gerne, um auf eine beliebige Komponente der Typsyntax zu verweisen, unabhängig davon, ob die Art es erlaubt, Ausdrücke zu klassifizieren.

Die Syntax von Typen kann um verschiedene Deklarationsformen erweitert werden.

  1. Ein Synonym , zB type Foo x y z = [x] -> IO (y, z) , fügt Typenkomponenten der vollständig angewendeten Form Foo x y z hinzu , die Makro-Mode entsprechend ihrer Definitionsgleichung erweitern.
  2. Eine data -Deklaration, zB data Goo x y z = ThisGoo x | ThatGoo (Goo y z x) führt einen neuen -Typkonstruktor Symbol% ​​co_de% in die Syntax von Typen ein, der verwendet wird, um die Typen zu erstellen, die klassifizieren Werte, die von den Datenkonstruktoren generiert wurden, hier Goo und ThisGoo .
  3. Eine Deklaration newtype , z. B. ThatGoo , erstellt eine Kopie eines vorhandenen Typs, der sich vom Original in der Syntax der Typen unterscheidet.

Ein Typ ist polymorph , wenn er -Typvariablen enthält, die durch andere Typkomponenten ersetzt werden können: Die durch polymorphe Typen klassifizierten Werte können spezialisiert zu einer Substitutionsinstanz des Typs Variablen. Z.B. append newtype Noo x y z = MkNoo (x, [y], z) funktioniert bei Listen, deren Elemente den gleichen Typ haben, aber jeder Typ funktioniert. Werte mit polymorphen Typen werden oft als "polymorphe Werte" bezeichnet.

Manchmal wird "Datentyp" verwendet, um einfach einen Typ zu bezeichnen, der durch eine (++) :: [a] -> [a] -> [a] -Deklaration eingeführt wird. In diesem Sinne sind alle Datentypen Typen, aber nicht alle Typen sind Datentypen. Beispiele für Typen, die keine Datentypen sind, sind data und IO () . Außerdem ist Int -> Int kein Datentyp in dies Sinne: es ist ein fest verdrahteter primitiver -Typ. Um Zweifel zu vermeiden, nennen einige Leute diese Typen algebraische Datentypen, weil die Konstruktoren eine Algebra geben, was "eine Menge von Operationen zum Bilden von Werten durch Kombinieren anderer Werte" bedeutet. Ein "polymorpher Datentyp" ist ein Datentyp mit darin enthaltenen Typvariablen, z. B. Int , im Gegensatz zu [(a, Bool)] . Manchmal reden Leute über "deklarieren eines polymorphen Datentyps" oder sagen Dinge wie " [Int] ist ein polymorpher Datentyp", wenn sie wirklich nur bedeuten, dass der Typkonstruktor Parameter hat (und somit zur Bildung polymorpher Typen verwendet werden kann): pedantisch, man deklariert einen polymorphen Datentyp, aber keinen alten polymorphen Datentyp, sondern einen Typkonstruktor, der auf formale Parameter angewendet wird.)

Natürlich sind alle erstklassigen Werte, die nach Typen klassifiziert sind, in gewissem Sinne "Daten", und in Haskell werden Typen nicht verwendet, um etwas zu klassifizieren, das nicht ein erstklassiger Wert ist, also in diesem loseren Sinne jedes " Geben Sie "ist ein" Datentyp "ein. Die Unterscheidung wird in Sprachen bedeutsamer, in denen es andere Dinge als Daten gibt, die Typen haben (z. B. Methoden in Java).

Informeller Gebrauch ist oft irgendwo in der Mitte und nicht sehr gut definiert. Menschen fahren oft mit einer Art Unterscheidung zwischen Funktionen oder Prozessen und der Art von Dingen (den "Daten"), auf denen sie operieren. Oder sie könnten sich Daten als "in Bezug auf die Art und Weise, in der sie gemacht werden" verstehen (und ihre Repräsentation beispielsweise durch Mustererkennung offen legen) und nicht "in Bezug auf die Art, wie sie verwendet werden" verstehen. Diese letzte Verwendung von "Daten" sitzt ein wenig unbehaglich mit der Vorstellung eines abstrakten -Datentyps, der ein Typ ist, der die Darstellung des zugrundeliegenden Materials verbirgt. Repräsentation-verbergende abstrakte Datentypen kontrastieren also eher stark mit der Darstellung ausstellender algebraischer Datentypen, weshalb es eher bedauerlich ist, dass "ADT" beiläufig als Abkürzung für beide verwendet wird.

Das Ergebnis, fürchte ich, ist vage.

    
pigworker 18.07.2014, 16:33
quelle
3

In diesem Fall sind data type und type synonym. Ich gebe jedoch zu, dass Verwirrung entstehen kann, weil Haskell zwei Schlüsselwörter data und type hat, die zwei sehr unterschiedliche Funktionen ausführen. Um die Unterscheidung klar zu halten, ist es wichtig, den Kontext zu beachten. Wenn Sie über die Typen in einer Signatur oder Typen im Allgemeinen sprechen, beziehen sich die Begriffe "Datentypen" und "Typen" fast immer auf dasselbe. Wann immer Sie über die Deklaration von Typen in Code sprechen, kann es einen Unterschied geben.

Ein mit data deklarierter Typ ist ein neuer, benutzerdefinierter Typ, sodass Sie Dinge wie

tun können %Vor%

Dabei sind Ready , NotReady und Exploded neue Konstruktoren, die nicht in Haskell enthalten sind.

Auf der anderen Seite gibt es das Schlüsselwort type , das einfach einen Alias ​​ für einen vorhandenen Typ erstellt:

%Vor%

Hier ist der Status einfach ein Alias ​​für String , und überall wo Sie String verwenden, können Sie Status verwenden und umgekehrt. Es gibt keine Konstruktoren, nur vorgefertigte Werte zu verwenden. Dieser Ansatz ist weit weniger sicher und wenn Sie so etwas verwenden, wird irgendwann zu Bugs führen. type -Deklarationen werden häufig verwendet, um bestimmte Argumente deutlicher zu machen, wozu sie dienen, beispielsweise

%Vor%

Dies ist ein eingebauter Alias ​​in GHC und wenn Sie eine Funktion sehen

%Vor%

Dann wissen Sie sofort, dass Sie ihm einen Dateinamen geben, im Vergleich zu

%Vor%

Sie haben keine Ahnung was diese Funktion macht, außer "etwas". Sie werden auch häufig verwendet, um das Tippen zu reduzieren, wie zum Beispiel:

%Vor%

Jetzt können Sie Point anstelle von (Double, Double) in Ihren Typ-Signaturen verwenden, die kürzer geschrieben und besser lesbar sind.

Zusammenfassend deklariert data einen völlig neuen Typ, der nur für Sie völlig benutzerdefiniert ist, und type sollte in alias umbenannt werden, damit die Leute nicht mehr verwirrt werden, wenn sie sich Haskell nähern.

    
bheklilr 18.07.2014 14:07
quelle
0

type und data type beziehen sich auf das gleiche Konzept, ebenso wie polymorphic type und polymorphic data type .

Um einen Fall zu illustrieren, in dem beide Ausdrücke zusammen verwendet werden können (ohne irgendeinen Unterschied in der Bedeutung), betrachten Sie diesen Ausdruck

%Vor%

Ich kann sagen, dass ich gerade einen polymorphen Datentyp Maybe mit dem polymorphen Typparameter a definiert habe.

    
Evan Sebastian 18.07.2014 14:07
quelle

Tags und Links