เป็นคำถามที่ดีมาก!
มีความแตกต่างที่สำคัญหลายประการ
การแสดง
- A
newtype
รับประกันว่าข้อมูลของคุณจะมีการแสดงที่เหมือนกับรันไทม์เหมือนกับชนิดที่คุณตัดคำ
- ในขณะที่
data
ประกาศโครงสร้างข้อมูลใหม่ที่รันไทม์
ดังนั้นจุดสำคัญที่นี่คือการสร้างสำหรับnewtype
รับประกันจะถูกลบในเวลารวบรวม
ตัวอย่าง:
newtype Book = Book (Int, Int)
สังเกตว่ามันมีการแสดงเหมือนกันทุกประการเหมือนกับ a (Int,Int)
เนื่องจากตัวBook
สร้างถูกลบทิ้ง
data Book = Book (Int, Int)
มีเพิ่มเติมคอนสตรัคไม่ได้อยู่ในBook
newtype
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
คุณสมบัตินี้จึงไม่เก็บ
ตัวชี้พิเศษในBook
to to (,)
constructor ช่วยให้เราสามารถใส่ค่าล่าง
เป็นผลให้newtype
และdata
มีคุณสมบัติในการเข้มงวดแตกต่างกันเล็กน้อยในขณะที่อธิบายไว้ในบทความวิกิพีเดีย Haskell
unboxing
มันไม่สมเหตุสมผลที่จะแกะส่วนประกอบของ a newtype
ออกเนื่องจากไม่มีคอนสตรัคเตอร์ ในขณะที่มันมีเหตุผลอย่างสมบูรณ์แบบที่จะเขียน:
data T = T {-# UNPACK #-}!Int
ยอมให้วัตถุรันไทม์ที่มีคอนT
สตรัคเตอร์และInt#
ส่วนประกอบ คุณเพียงแค่ได้รับเปลือยด้วยInt
newtype
การอ้างอิง :