Gute Frage!
Es gibt mehrere wesentliche Unterschiede.
Darstellung
- A
newtypegarantiert, dass Ihre Daten zur Laufzeit genau dieselbe Darstellung haben wie der Typ, den Sie umbrechen.
- Während
datadeklariert zur Laufzeit eine brandneue Datenstruktur.
Der entscheidende Punkt hierbei ist also, dass das Konstrukt für das newtypebeim Kompilieren garantiert gelöscht wird.
Beispiele:

newtype Book = Book (Int, Int)

Beachten Sie, dass es genau die gleiche Darstellung wie a hat (Int,Int), da der BookKonstruktor gelöscht wird.
data Book = Book (Int, Int)

Hat einen zusätzlichen BookKonstruktor nicht in der newtype.
data Book = Book {-# UNPACK #-}!Int {-# UNPACK #-}!Int

Keine Hinweise! Die beiden IntFelder sind wortgroße Felder im BookKonstruktor.
Algebraische Datentypen
Aufgrund dieser Notwendigkeit, den Konstruktor zu löschen, newtypefunktioniert a nur, wenn ein Datentyp mit einem einzelnen Konstruktor umbrochen wird . Es gibt keine Vorstellung von "algebraischen" neuen Typen. Das heißt, Sie können kein Newtype-Äquivalent von beispielsweise schreiben.
data Maybe a = Nothing
| Just a
da es mehr als einen Konstruktor hat. Du kannst auch nicht schreiben
newtype Book = Book Int Int
Strenge
Die Tatsache, dass der Konstruktor gelöscht wird, führt zu einigen sehr subtilen Unterschieden in der Strenge zwischen dataund newtype. Insbesondere wird dataein Typ eingeführt, der "angehoben" wird, was im Wesentlichen bedeutet, dass er eine zusätzliche Möglichkeit bietet, einen unteren Wert zu ermitteln. Da es zur Laufzeit mit keinen zusätzlichen Konstruktor gibt newtype, gilt diese Eigenschaft nicht.
Mit diesem zusätzlichen Zeiger im Bookto- (,)Konstruktor können wir einen unteren Wert eingeben.
Infolgedessen newtypeund datahaben leicht unterschiedliche Strengeigenschaften, wie im Haskell-Wiki-Artikel erläutert .
Unboxing
Es ist nicht sinnvoll, die Komponenten von a zu entpacken newtype, da es keinen Konstruktor gibt. Während es völlig vernünftig ist zu schreiben:
data T = T {-# UNPACK #-}!Int
Ausgeben eines Laufzeitobjekts mit einem TKonstruktor und einer Int#Komponente. Sie bekommen nur eine nackte Intmit newtype.
Referenzen :