Harika bir soru!
Birkaç temel fark vardır.
temsil
- Bir
newtypeverilerinizin sarın o türü olarak, zamanında tam olarak aynı gösterimi olacak garanti eder.
- Süre
dataçalışma sırasında yepyeni bir veri yapısı ilan ederken .
Buradaki anahtar nokta newtype, derlemenin yapısının derleme zamanında silineceği garantisidir.
Örnekler:

newtype Book = Book (Int, Int)

Yapıcı silindiğinden (Int,Int), a ile tam olarak aynı temsile nasıl sahip olduğuna dikkat edin Book.
data Book = Book (Int, Int)

'De Bookbulunmayan ek bir kurucu var newtype.
data Book = Book {-# UNPACK #-}!Int {-# UNPACK #-}!Int

İşaretçi yok! İki Intalan, Bookyapıcıdaki kutulanmamış sözcük boyutlu alanlardır .
Cebirsel veri türleri
Bu yapıcıyı silmek gerektiğinden, newtypeyalnızca bir veri türünü tek bir kurucu ile sararken çalışır . "Cebirsel" yeni tipler hakkında hiçbir fikir yoktur. Yani, yeni bir tür eşdeğer yazamazsınız, örneğin,
data Maybe a = Nothing
| Just a
çünkü birden fazla kurucusu var. Ne yazamazsın
newtype Book = Book Int Int
katılık
Yapıcı arasındaki katılığından bazı çok ince farklılıklara yol silinir gerçeği datave newtype. Özellikle, data"kaldırılmış", yani temelde bir alt değeri değerlendirmek için ek bir yolu olduğu anlamına gelen bir tür sunar. Çalışma zamanında ek kurucu bulunmadığından newtype, bu özellik tutulmaz.
İçinde O ekstra işaretçi Bookiçin (,)yapıcı bize bir alt değer koymak için izin verir.
Sonuç olarak, newtypeve datagibi biraz farklı katılık özelliklerine sahip Haskell wiki makalesinde açıklanmıştır .
Unboxing
Bir newtypekurucu olmadığı için a'nın bileşenlerinin kutularını açmak mantıklı değil . Yazmak kesinlikle makul olsa da:
data T = T {-# UNPACK #-}!Int
bir Tkurucu ve bir Int#bileşen ile bir çalışma zamanı nesnesi verir . Sen sadece bir çıplak olsun Intile newtype.
Kaynaklar :