Pertanyaan bagus!
Ada beberapa perbedaan utama.
Perwakilan
- A
newtype
menjamin bahwa data Anda akan memiliki representasi yang sama persis saat runtime, seperti tipe yang Anda bungkus.
- Sementara
data
mendeklarasikan 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 Book
konstruktor dihapus.
data Book = Book (Int, Int)
Memiliki Book
konstruktor tambahan tidak ada dalam newtype
.
data Book = Book {-# UNPACK #-}!Int {-# UNPACK #-}!Int
Tidak ada petunjuk! Dua Int
bidang adalah bidang berukuran kata tanpa kotak di dalam Book
konstruktor.
Tipe data aljabar
Karena kebutuhan ini untuk menghapus konstruktor, newtype
hanya 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 data
dan newtype
. Secara khusus, data
memperkenalkan 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 Book
to (,)
constructor memungkinkan kita untuk memasukkan nilai terbawah.
Akibatnya, newtype
dan data
memiliki 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 T
konstruktor, dan Int#
komponen. Anda hanya mendapatkan telanjang Int
dengan newtype
.
Referensi :