เป็นคำถามที่ดีมาก!
มีความแตกต่างที่สำคัญหลายประการ
การแสดง
- A
newtypeรับประกันว่าข้อมูลของคุณจะมีการแสดงที่เหมือนกับรันไทม์เหมือนกับชนิดที่คุณตัดคำ
- ในขณะที่
dataประกาศโครงสร้างข้อมูลใหม่ที่รันไทม์
ดังนั้นจุดสำคัญที่นี่คือการสร้างสำหรับnewtypeรับประกันจะถูกลบในเวลารวบรวม
ตัวอย่าง:

newtype Book = Book (Int, Int)

สังเกตว่ามันมีการแสดงเหมือนกันทุกประการเหมือนกับ a (Int,Int)เนื่องจากตัวBookสร้างถูกลบทิ้ง
data Book = Book (Int, Int)

มีเพิ่มเติมคอนสตรัคไม่ได้อยู่ในBooknewtype
data Book = Book {-# UNPACK #-}!Int {-# UNPACK #-}!Int

ไม่มีตัวชี้! Intฟิลด์สองฟิลด์เป็นฟิลด์ขนาดคำที่ไม่ได้กำหนดไว้ในตัวBookสร้าง
ชนิดข้อมูลเชิงพีชคณิต
เพราะความจำเป็นนี้เพื่อลบตัวสร้างการnewtypeทำงานเฉพาะเมื่อห่อชนิดข้อมูลกับนวกรรมิกเดียว ไม่มีความคิดเกี่ยวกับ newtypes "พีชคณิต" นั่นคือคุณไม่สามารถเขียนรูปแบบใหม่ที่เทียบเท่าพูดได้
data Maybe a = Nothing
| Just a
เนื่องจากมีคอนสตรัคเตอร์มากกว่าหนึ่งตัว คุณไม่สามารถเขียน
newtype Book = Book Int Int
ความเข้มงวด
ความจริงที่ว่าคอนสตรัคจะถูกลบออกนำไปสู่ความแตกต่างบางอย่างในระหว่างเข้มงวดและdata newtypeโดยเฉพาะอย่างยิ่งdataแนะนำประเภทที่ "ยก" ความหมายเป็นหลักว่ามันมีวิธีการเพิ่มเติมในการประเมินมูลค่าด้านล่าง เนื่องจากไม่มีคอนสตรัคเตอร์เพิ่มเติมขณะใช้งานด้วยnewtypeคุณสมบัตินี้จึงไม่เก็บ
ตัวชี้พิเศษในBookto to (,)constructor ช่วยให้เราสามารถใส่ค่าล่าง
เป็นผลให้newtypeและdataมีคุณสมบัติในการเข้มงวดแตกต่างกันเล็กน้อยในขณะที่อธิบายไว้ในบทความวิกิพีเดีย Haskell
unboxing
มันไม่สมเหตุสมผลที่จะแกะส่วนประกอบของ a newtypeออกเนื่องจากไม่มีคอนสตรัคเตอร์ ในขณะที่มันมีเหตุผลอย่างสมบูรณ์แบบที่จะเขียน:
data T = T {-# UNPACK #-}!Int
ยอมให้วัตถุรันไทม์ที่มีคอนTสตรัคเตอร์และInt#ส่วนประกอบ คุณเพียงแค่ได้รับเปลือยด้วยIntnewtype
การอ้างอิง :