Pertanyaan bagus!
Ada beberapa perbedaan utama.
Perwakilan
- A
newtypemenjamin bahwa data Anda akan memiliki representasi yang sama persis saat runtime, seperti tipe yang Anda bungkus.
- Sementara
datamendeklarasikan struktur data baru saat runtime.
Jadi titik kunci di sini adalah bahwa konstruksi untuk newtype dijamin akan dihapus pada waktu kompilasi.
Contoh:

newtype Book = Book (Int, Int)

Perhatikan bagaimana ia memiliki representasi yang sama persis dengan a (Int,Int), karena Bookkonstruktor dihapus.
data Book = Book (Int, Int)

Memiliki Bookkonstruktor tambahan tidak ada dalam newtype.
data Book = Book {-# UNPACK #-}!Int {-# UNPACK #-}!Int

Tidak ada petunjuk! Dua Intbidang adalah bidang berukuran kata tanpa kotak di dalam Bookkonstruktor.
Tipe data aljabar
Karena kebutuhan ini untuk menghapus konstruktor, newtypehanya berfungsi ketika membungkus tipe data dengan konstruktor tunggal . Tidak ada gagasan tentang tipe baru "aljabar". Artinya, Anda tidak dapat menulis jenis baru yang setara dengan, katakanlah,
data Maybe a = Nothing
| Just a
karena memiliki lebih dari satu konstruktor. Anda juga tidak bisa menulis
newtype Book = Book Int Int
Kekerasan
Fakta bahwa konstruktor dihapus mengarah ke beberapa perbedaan yang sangat halus dalam keketatan antara datadan newtype. Secara khusus, datamemperkenalkan tipe yang "diangkat", yang berarti, pada dasarnya, ia memiliki cara tambahan untuk mengevaluasi ke nilai terbawah. Karena tidak ada konstruktor tambahan saat runtime dengannewtype , properti ini tidak berlaku.
Pointer ekstra di dalam Bookto (,)constructor memungkinkan kita untuk memasukkan nilai terbawah.
Akibatnya, newtypedan datamemiliki sifat keketatan yang sedikit berbeda, seperti yang dijelaskan dalam artikel wiki Haskell .
Buka kotak
Tidak masuk akal untuk membuka kotak komponen newtype, karena tidak ada konstruktor. Meskipun sangat masuk akal untuk menulis:
data T = T {-# UNPACK #-}!Int
menghasilkan objek runtime dengan Tkonstruktor, dan Int#komponen. Anda hanya mendapatkan telanjang Intdengan newtype.
Referensi :