Haskell中`data`和`newtype`之间的区别

|| 我写这篇文章有什么区别?
data Book = Book Int Int
newtype Book = Book (Int, Int) -- \"Book Int Int\" is syntactically invalid
    
已邀请:
好问题! 有几个主要区别。 表示
newtype
保证您的数据在运行时将具有与包装的类型完全相同的表示形式。
data
在运行时声明了全新的数据结构。 因此,这里的重点是保证ѭ2the的构造在编译时会被删除。 例子:
data Book = Book Int Int
newtype Book = Book (Int, Int)
注意,由于删除了
Book
构造函数,因此它与
(Int,Int)
具有完全相同的表示形式。
data Book = Book (Int, Int)
newtype
中没有其他的
Book
构造函数。
data Book = Book {-# UNPACK #-}!Int {-# UNPACK #-}!Int
没有指针!两个
Int
字段是
Book
构造函数中未装箱的单词大小的字段。 代数数据类型 由于需要擦除构造函数,因此只有在用单个构造函数包装数据类型时,ѭ2才有效。没有“代数”新类型的概念。也就是说,您不能编写与
data Maybe a = Nothing
             | Just a
因为它有多个构造函数。你也不能写
newtype Book = Book Int Int
严格 删除构造函数的事实在
data
newtype
之间的严格性上导致一些非常细微的差异。特别地,“ 3”引入了一种“提升”类型,从本质上讲,它意味着可以使用另一种方式求出底值。由于在运行时没有带有constructor2ѭ的附加构造函数,因此该属性不成立。
Book
(,)
构造函数中的额外指针使我们可以放入一个底值。 结果,如Haskell Wiki文章所述,
newtype
data
的严格性属性稍有不同。 拆箱 因为没有构造函数,所以将ѭ2的组件拆箱是没有意义的。虽然写是完全合理的:
data T = T {-# UNPACK #-}!Int
生成一个带有ѭ28with构造函数和
Int#
组件的运行时对象。您只得到a2ѭ的
Int
。 参考文献: Haskell Wiki上的“ Newtype” 诺曼·拉姆齐(Norman Ramsey)关于严格性属性的答案     

要回复问题请先登录注册