Harika bir soru!
Birkaç temel fark vardır.
temsil
- Bir
newtype
verilerinizin 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 Book
bulunmayan ek bir kurucu var newtype
.
data Book = Book {-# UNPACK #-}!Int {-# UNPACK #-}!Int
İşaretçi yok! İki Int
alan, Book
yapıcıdaki kutulanmamış sözcük boyutlu alanlardır .
Cebirsel veri türleri
Bu yapıcıyı silmek gerektiğinden, newtype
yalnı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 data
ve 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 Book
için (,)
yapıcı bize bir alt değer koymak için izin verir.
Sonuç olarak, newtype
ve data
gibi biraz farklı katılık özelliklerine sahip Haskell wiki makalesinde açıklanmıştır .
Unboxing
Bir newtype
kurucu 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 T
kurucu ve bir Int#
bileşen ile bir çalışma zamanı nesnesi verir . Sen sadece bir çıplak olsun Int
ile newtype
.
Kaynaklar :